AOP

作者: dnasn | 来源:发表于2019-03-10 19:50 被阅读0次

    一、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

    相关文章

      网友评论

          本文标题:AOP

          本文链接:https://www.haomeiwen.com/subject/sayppqtx.html