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

<!--&lt;!&ndash;配置一个Hello的类&ndash;&gt;-->
    <bean id="hello" class="com.spring.AoP.HelloImpl"/>
    <!--&lt;!&ndash;配置一个MyBeforeAdvice前值增前的类&ndash;&gt;-->
        <bean id="myBeforeAdvice" class="com.spring.AoP.MyBeforeAdvice"/>
      <!--&lt;!&ndash;配置aop&ndash;&gt;-->
     <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
上一篇下一篇

猜你喜欢

热点阅读