美文网首页
10.AOP学习

10.AOP学习

作者: 王杰磊 | 来源:发表于2019-03-09 10:28 被阅读0次

    AOP的概念

    • AOP(Aspect Oriented Programming,面向切面编程,在AOP中,模块化的单元是切面。切面可以实现跨多个类型和对象之间的事务管理、日志等方面的模块化,基本上通过代理机制实现与面向对象编程相比AOP是豪放派的选择,大手一挥,凡某某包某类某命名方法,一并同样处理(正则表达式)。

    AOP的优势

    • 提供声明式企业服务
    • 允许用户自定义切面
    • 可以对业务逻辑的各个部分进行隔离

    AOP核心概念

    • Aspect(切面)
    • Join Point(连接点)
    • Advice(通知)
    • Pointcut(切入点)
    • Introduce(引入)
    • Target Project(目标对象)
    • AOP Proxy(AOP代理)
    • Weaving(织入)

    AOP示例

    • 新建一个接口Move
    package com.spring.aop;
    
    public interface Move {
        public void move();
    }
    
    • 新建一个Tank类,继承Move接口的move方法
    package com.spring.aop;
    
    public class Tank implements Move {
        @Override
        public void move() {
            System.out.println("Tank is moving");
        }
    }
    
    • 新建一个TankProxy代理Move接口
    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("stop");
        }
    }
    
    • Moveapp
    package com.spring.aop;
    
    public class MoveApp {
        public static void main(String[] args) {
            Move t=new Tank();
            Move t1=new Car();
            Move moveproxy=new TankProxy(t);
            Move moveproxy1=new TankProxy(t1);
            moveproxy.move();
            moveproxy1.move();
        }
    }
    

    结果


    image.png

    AOP前置方法示例

    • 新建一个Hello接口,定义一个getHello方法
    package com.spring.aop;
    
    public interface Hello {
        String getHello();
    }
    
    • 定义一个HelloImpl类继承getHello方法
    package com.spring.aop;
    
    public class HelloImpl implements Hello {
        @Override
        public String getHello() {
            return "Hello,Spring AOP";
        }
    }
    
    • 自定义一个前置增强类MyBeforeAdvice
    package com.spring.aop;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 用户自定义的前置增强类
     */
    public class MyBeforeAdvice {
        private static final Logger logger= LoggerFactory.getLogger("Hello.class");
    //    定义前置方法
        public void beforeMethod(){
            logger.info("错误");
            System.out.println("this is a before method");
        }
    }
    
    • 配置Bean和AOP
    <!--配置一个Hello的bean,等同于Hello hello=new HelloImpl-->
        <bean id="hello" class="com.spring.aop.HelloImpl"/>
        <!--配置一个MyBeforeAdvice前置增强的bean-->
        <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>
    
    • 新建一个HelloApp实现
    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());
        }
    }
    

    结果


    image.png

    相关文章

      网友评论

          本文标题:10.AOP学习

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