0%

springAOP

AOP Aspect Oriented Programming 面向切面编程。
spring的AOP的基于代理模式的,而且必须是IOC容器创建依赖对象。
你需要至少链接以下三个概念:
目标对象:(被代理的)
增强对象:(代理者)
切入点:(怎么样切?)
建议先去查看动态代理模式。这种做法的好处:是的我们在目标对象中可以专心做事,把共享问题统一在切面的增强中解决,将业务逻辑与系统逻辑分离开来。
image.png
如果你需要在spring中实现AOP哪里你需要以下步骤:

1:编写增强类

如前置增强,就让他实现MethodBeforeAdvice接口,并重写before方法。
如后置增强,就让他实现AfterReturningAdvice接口,并重写afterReturning方法。

2:在spring容器中创建bean对象

如果还要使用AOP,那么对象必须由spring容器创建。

3:植入切面

切面必须包括两个部分,切入点(什么时候切?如何切?切多少?)和增强。
因为切入是为了做事,在什么时候?做什么事?
示范:

1
2
3
4
5
6
7
<!--织入切面配置-->
<aop:config>
<!--定义切入点 指定拦截方法-->
<aop:pointcut id="pointcut" expression="execution(public int getSum(int,int))"></aop:pointcut>
<!--指定增强对象-->
<aop:advisor pointcut-ref="pointcut" advice-ref="myBeforeAdvice"></aop:advisor>
</aop:config>

关于切入点的时机可以参考以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
public int getSum(int,int)  表示方法名getSum带两个整型参数,返回为int

public int getSum(..) 表示方法名getSum带任意参数,返回的值int方法

* getSum(..) 表示方法名getSum带任意参数,任意返回值的方法

* *(..) 表示所有方法

* com.aop.MathTools.*(..) 表示MathTools类下的所有方法

* com.aop.*.*(..) 表示aop包下所有类的所有方法

* com.aop..*.*(..) 表示aop包下所有类级其子包下所类的所有方法,任意参数,任意返回值都切

最后,如果要实现上述功能需要的依赖是:

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>