美文网首页
Day 05 AOP面向切面编程起步

Day 05 AOP面向切面编程起步

作者: 忆曦雪_ | 来源:发表于2019-03-09 20:43 被阅读0次

    一、对AOP的基本了解

    • 我们要做的不是纵向的抽取,而是横向的抽取
    • AOP是OOP的有益补充,为程序开发提供了一个崭新的思考角度,可以将重复性的横切逻辑抽取到统一的模块中
    • 通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码性问题
    • 定义:在运行时,动态地将代码切入到类的指定方法,指定位置上的编程思想就是面向切面的编程
    • AOP基本是通过代理机制实现的
      • 注意:AOP的使用场景是日志和事务,代理(Proxy)的对象是接口

    二、实例练习

    • 添加依赖
    <!--spring-aop依赖-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
    • Tank的移动:
      Move类:
    package com.spring.aop;
    
    public interface Move {
        public void move();
    }
    
    

    Tank类:

    package com.spring.aop;
    
    public interface Move {
        public void move();
    }
    
    

    TankProxy类:

    package com.spring.aop;
    
    public class TankProxy implements Move{
        private Move t;
    
        public TankProxy(Move t) {
            this.t = t;
        }
        @Override
        public void move() {
            System.out.println("Start!");
            t.move();
            System.out.println("finsh!");
        }
    }
    

    TankApp类:

    package com.spring.aop;
    
    public class TankApp {
        public static void main(String[] args) {
            Move t=new Tank();
            Move moveproxy=new TankProxy(t);
            moveproxy.move();
    
        }
    }
    
    

    运行截图:


    运行结果

    三、Hello的前置增强练习

    1.添加依赖
    之前已添加可以忽略
    2.创建Hello接口和其实现类

    package com.spring.aop;
    
    public interface Hello {
        String getHello();
    }
    
    package com.spring.aop;
    
    public class HelloImpl implements Hello{
        @Override
        public String getHello() {
            return "Hello,Spring Aop";
        }
    }
    

    3.MyBeforeAdvice类

    package com.spring.aop;
    
    import org.slf4j.LoggerFactory;
    import org.slf4j.Logger;
    /**
     * 用户自定义的前置增强类
     */
    public class MyBeforeAdvice {
        private static final Logger logger = LoggerFactory.getLogger(MyBeforeAdvice.class);
    //    定义前置方法
        public void beforeMethod(){
        //    logger.debug("This a before method by Wuyou");
            System.out.println("This is a before method.");
        }
    }
    

    4.配置xml文件

    <!--配置一个Hello的bean-->
        <bean id="hello" class="com.spring.aop.HelloImpl"></bean>
        <!--配置一个MyBeforeAdviced的bean-->
        <bean id="mybeforeadvice" class="com.spring.aop.MyBeforeAdvice"></bean>
        <aop:config>
          <aop:aspect id="mybeforeadvice" ref="mybeforeadvice" >
              <aop:pointcut id="mypointcut" expression="execution(* com.spring.aop.*.*(..))"/>
              <aop:before method="beforeMethod" pointcut-ref="mypointcut"/>
          </aop:aspect>
        </aop:config>
    

    5.创建app类

    package com.spring.aop;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class HelloApp {
        public static void main(String[] args) {
            ApplicationContext context=
                    new ClassPathXmlApplicationContext("/spring.xml");
            Hello hello =context.getBean(Hello.class);
            System.out.println(hello.getHello());
        }
    
    }
    

    6.运行结果


    运行结果

    相关文章

      网友评论

          本文标题:Day 05 AOP面向切面编程起步

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