execution(* *..*Service+.*(..)) 这是aop切入点表达式,这个含义是什么?
时间: 2024-07-15 13:00:52 浏览: 115
execution(* *..*Service+.*(..)) 是一个典型的Aspect Oriented Programming (AOP) 中的切入点表达式,用于Spring AOP(Spring框架中的切面编程)中定义通知(advice)何时执行。这个表达式的各个部分含义如下:
1. `execution`:这是一个关键字,表示这是对方法执行的规则定义。
2. `(* *..*Service+.*(..))`:
- `*`:通配符,表示任意类型,这意味着这个规则适用于任何类型的类。
- `*..*Service`:这部分匹配的是所有包含`Service`这个词的服务类,`*`在类名和接口名之间,表示可以是任何类名,后跟`Service`接口。
- `+`:动态匹配,意味着不仅限于直接实现了`Service`接口的类,还包括实现了这个接口的任何其他类。
- `.*(..)`:这部分匹配的是类的方法,`.*`表示任意方法名,`(..)`代表方法参数列表,即接受任意数量和类型的参数,并且不考虑返回值。
总的来说,这个表达式的意思是:当程序中调用任何一个继承自`Service`接口的类中的任何方法时,都会应用关联的切面(如日志记录、事务管理等)。
相关问题
代码报错<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:comtext="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 1 准备目标类 --> <bean id="personDao" class="com.sc.spring.dao.impl.PersonDaoImpl"></bean> <!-- 2 准备增强类 --> <bean id="myAdvice" class="com.sc.spring.utils.MyAdvice"></bean> <!-- 3 织入 将增强类的增强方法应用到目标类的目标方法前后 --> <aop:config> <!-- pointcut标签声明切入点表达式 切入点表达式就是一种规则 spring aop根据规则找到满足规则的目标方法 然后对目标方法前后进行指定增强 --> <aop:pointcut id="pc" expression="execution(public boolean com.sc.spring.dao.impl.PersonDaoImpl.getPersonByUsernameAndPwd(java.lang.String,java.lang.String))"></aop:pointcut> <aop:aspect ref="myAdvice"> <!-- aop:before标签代表配置前置通知 method属性是配置增强类中哪个方法作为前置通知执行 --> <aop:before method="before" pointcut-ref="pc"></aop:before> </aop:aspect> </aop:config> </beans>报错问题是org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 22 in XML document from class path resource [aop.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 22; columnNumber: 17; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'aop:config' 的声明。
这个报错提示是说在 aop.xml 中的第 22 行出现了问题,无法找到 'aop:config' 元素的声明。可能的原因是在 aop.xml 中没有正确引入 aop 命名空间或者少了相应的依赖。
你可以检查以下几个方面:
1. 检查 aop.xml 中是否正确引入了 aop 命名空间,如下:
```xml
xmlns:aop="http://www.springframework.org/schema/aop"
```
2. 检查是否有缺失相应的依赖,如下:
```xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
```
3. 检查是否使用了正确的版本,如下:
```xml
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop/spring-aop.xsd"
```
如果以上步骤都检查完毕,还是出现相同的报错,可以尝试在 aop.xml 文件的顶部添加以下代码:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- your aop configuration here -->
</beans>
```
希望这些方法可以帮助你解决问题。
切入点表达式的写法?切入点方法(名称)的定义与使用。 通知方法上如何添加注解?
切面编程(AOP,Aspect-Oriented Programming)中的切入点表达式是一种用于定位需要应用切面(如日志记录、事务管理等)的特定执行点的语言。常见的切入点表达式包括:
1. 类名或包名:`@Aspect`注解的`pointcut`属性可以指定一个简单的基本匹配,如`execution(* com.example.service.*.*(..))`,表示所有com.example.service包下的类的公共方法都将作为切入点。
2. 方法签名匹配:例如,`execution(public * methodName*(..))`,指定了某个方法作为切入点,其中*methodName*是你要匹配的具体方法名。
3. 条件表达式:`and()`、`or()`、`not()`等可以组合多个条件,如`execution(* get*(..) && !within(OrderServiceImpl.class))`,只对不在OrderServiceImpl类内的get方法应用切面。
4. 运算符和通配符:还可以使用`args()`、`target()`等运算符来进一步细化匹配,比如检查方法参数或目标对象类型。
切入点方法(通常称为通知方法,如`before()`, `after Returning()`, 等)是切面中的实际业务逻辑部分,用于在指定的切入点执行前、后或异常处理等场景。定义一个通知方法时,需要添加特定的注解,例如:
- `@Before("pointcutExpression")`: 在切入点执行之前调用的方法,`pointcutExpression`即上面提到的切入点表达式。
- `@AfterReturning("pointcutExpression", result="returnVal")`: 指定的方法将在切入点执行并返回结果之后调用,`result`参数用于引用返回值。
- `@Around("pointcutExpression")`: 围绕式通知,提供完整的包围执行控制,方法体内部可以决定是否继续原方法执行。
要在通知方法上添加注解,只需在方法声明上方加上相应的AOP注解,如`@Around`或`@Before`,然后在注解中指定切入点表达式。例如:
```java
@Around("@annotation(log)")
public Object logAround(ProceedingJoinPoint joinPoint, Log log) throws Throwable {
// 执行前操作...
Object result = joinPoint.proceed(); // 调用原方法
// 执行后操作...
return result;
}
@Log(name = "myMethod")
public interface Log {
// 具体注解字段定义
}
```
在这个例子中,`@Log`是一个自定义注解,用于标记哪些方法应该被切面处理。
阅读全文