• Spring AOP前置通知实例说明AOP相关概念


    今天又看了下韩顺平的SpringAOP的讲解,讲解的很透彻。仿照视频自己使用下前置通知。

    一、引出问题

      有个接口TestServiceInter,有两个实现方法TestService和Test2Service。他们都有sayHello();我们的需求是在调用这两个方法之前,要先完成写日志的功能;

    二、菜鸟的想法

      我在各个实现类的sayHello()方法里面写上写日志的功能就是了。

      这样实现存在的问题:代码冗余。当所有实现类都要加上日志功能的时候,需要写很多重复代码

    三、利用AOP前置通知实现此功能

    3.1 第一步:我们需要定义一个接口  

    package com.jdc.aop;
    
    /**
     * @author DEllComputer
     * @Title: TestService
     * @ProjectName SpringAop
     * @Description:
     * @date 2018/12/251:38 PM
     */
    public interface TestService {
    
        /**
          * @Description:
          * @param ${tags}
          * @return ${return_type}
          * @throws
          * @author jdc
          * @date 2018/12/25 1:39 PM
          */
        void sayHi(String name);
    
    }

    3.2 第二步:实现接口

    public class TestServiceImpl implements TestService {
    
        private String name;
    
        /**
          * @Description: say hi
          * @param ${tags}
          * @return ${return_type}
          * @throws
          * @author jdc
          * @date 2018/12/25 1:40 PM
          */
        @Override
        public void sayHi(String name ) {
            System.out.println("hi:" + name);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    3.3 第三步:实现前置通知(AOP中通知的概念就是实现增强代码逻辑的,比如这里的记录日志)

    /**
     * @author DEllComputer
     * @Title: MyBeforeAdvice
     * @ProjectName SpringAop
     * @Description: 写日志前置通知
     * @date 2018/12/251:42 PM
     */
    public class MyBeforeAdvice implements MethodBeforeAdvice {
       
        /**
          * @Description: 写日志的功能
          * @param ${tags} 
          * @return ${return_type} 
          * @throws
          * @author jdc
          * @date 2018/12/25 1:44 PM 
          */
        @Override
        public void before(Method method, Object[] objects, Object o) throws Throwable {
            System.out.println("我是写日志的功能。");
        }
    }

    前置通知需要实现MethodBeforeAdvice接口,前置通知是在目标方法调用之前调用;

    3.4 第四步:在Spring的配置文件中配置代理对象,通知,目标对象

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 配置前置通知 -->
        <bean id="myBeforeAdvice" class="com.jdc.aop.advice.MyBeforeAdvice"/>
    
        <!-- 配置被代理对象 -->
        <bean id="logTestServiceImpl" class="com.jdc.aop.TestServiceImpl">
            <property name="name" value="Test"></property>
        </bean>
    
        <!-- 配置代理对象 -->
        <bean id="proxyFactoryBean"   class="org.springframework.aop.framework.ProxyFactoryBean">
            <!-- 代理接口集 配置哪些接口要被代理 -->
            <property name="proxyInterfaces">
                <list>
                    <value>com.jdc.aop.TestService</value>
                </list>
            </property>
    
            <!-- 把通知织入代理对象 -->
            <property name="interceptorNames">
                <value>myBeforeAdvice</value>
            </property>
    
            <!-- 配置被代理的对象 -->
            <property name="target" ref="logTestServiceImpl"/>
    
    
        </bean>
    
    
    </beans>
    ProxyFactoryBean是一个代理对象,如果我们被代理的对象实现了接口,Spring使用的是jdk动态代理技术实现的动态代理;所以我们要告诉代理对象,我们的哪些接口需要被代理,然后哪个对象需要被代理,我的增强实现应该怎么被织入到代理对象(前置,后置,环绕....)

    3.5 第五步:写测试代码测试

    public class TestMain {
    
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            //获取代理对象
            TestService log = (TestService) ac.getBean("proxyFactoryBean");
            log.sayHi("哈哈");
    
        }
    }

    注意这里,我们需要获取代理对象,而不是目标对象,不然不能调用前置通知的代码。

  • 相关阅读:
    深入解析MySQL分区(Partition)功能
    使用mysqlreplicate命令快速搭建 Mysql 主从复制
    MySQL优化/面试,看这一篇就够了
    Nginx+Keepalived高可用集群
    高并发核心技术
    Redis详解
    memcached 常用命令及使用说明
    MemCached详解
    音频和视频
    frameset 和iframe框架标签
  • 原文地址:https://www.cnblogs.com/softjiang/p/10177139.html
Copyright © 2020-2023  润新知