Spring-AOP-配置
spring-AOP-配置
1、步骤
1.1、创建一个接口PersonDao
1.2、创建一个目标类PersonDaoImpl
1.3、创建一个事务Transaction
1.4、把目标类和事务放入到spring容器中
1.5、进行aop的配置
1.5.1、引入aop的命名空间
1 | xmlns:aop="http://www.springframework.org/schema/aop" |
1.5.2、把PersonDao和Transaction放入到spring容器中
1 | <bean id="personDao" class="..."></bean> |
1.5.3、进行aop的配置
1 | <aop:config> |
2、原理:
- 1、启动spring容器,把personDao和transaction实例化
- 2、当spring容器解析到aop:config配置的时候,会解析切入点表达式
- 3、把切入点表达式解析出来以后,和spring容器中的bean做匹配,如果匹配成功,则为该bean创建代理对象;
- 4、代理对象的方法的创建过程就把通知和目标方法结合在一起了
- 5、当在客户端执行context.getBean时,先检查跟bean是否有代理对象,如果有代理对象,则返回代理对象;如果没有代理对象,则返回对象本身
注意:如果切入点表达式在spring容器中没有找到匹配的对象,则会报错
3、切入点配置说明
下面是spring切入点的配置说明:1
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)throws-pattern?)
直接看的话,还是不是很好理解
通过一个方法声明的来对比说明一下:1
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
修饰符类型 | 返回值类型 | 声明类型 | 方法名 | 参数类型 | 异常类型 |
---|---|---|---|---|---|
modifiers-pattern? | ret-type-pattern | declaring-type-pattern? | name-pattern | param-pattern | throws-pattern? |
public | void | java.lang.Object | wait | long | throws java.lang.InterruptedException |
切入点配置举例:
execution (public (..) ) : 表示任意公共方法
execution ( set(..) ) : 表示以set开头的任意方法
execution ( com.xyz.service.AccountService.(..) ) : 表示com.xyz.service.AccountService类中的所有方法
execution ( com.xyz.service..(..) ) :表示com.xyz.service包下的所有的类的所有的方法
execution ( com.xyz.service...(..) ) :表示com.xyz.service包下及其子包下的所有的类的所有的方法