AOP
2019-03-10 本文已影响0人
dnasn
一、AOP的基本概念:
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
二、 spring AOP
Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。
三、例子
创建一个接口
public interfance Move {
void move();
创建Tank类实现接口
public class Tank implements Move {
@Override
public void move() {
System.out.println("tank is moving");
}
}
创建一个接口代理类
public class MoveProxy implements Move {
//声明一个Move接口的对象
private Move t;
public MoveProxy(Move t) {
this.t = t;
}
@Override
public void move() {
System.out.println("start");
t.move();
System.out.println("Stop");
}
}
创建MoveApp类创建对象实现方法
public class MoveApp {
public static void main(String[] args) {
Move t = new Tank();
Move moveproxy = new MoveProxy(t);
t.move();
}
}
通过IoC容器配置bean
创建一个接口
public interface Hello {
String getHello();
}
创建一个类实现接口方法
public class HelloImpl implements Hello {
@Override
public String getHello() {
return "Hello, spring aop";
}
}
加一个前置增强
public class BeforeAdvice {
private static final Logger logger = (Logger) LoggerFactory.getLogger(BeforeAdvice.class);
public void beforeMethod(){
logger.debug("连接数据库");
}
}
在xml配置bean
<!--<!–配置一个Hello的类–>-->
<bean id="hello" class="com.spring.AoP.HelloImpl"/>
<!--<!–配置一个MyBeforeAdvice前值增前的类–>-->
<bean id="myBeforeAdvice" class="com.spring.AoP.MyBeforeAdvice"/>
<!--<!–配置aop–>-->
<aop:config>
<aop:aspect id="before" ref="myBeforeAdvice">
<aop:pointcut id="myPointCut" expression="execution(* com.spring.AoP.*.*(..))"/>
<aop:before method="beforeMethod" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>
image.png