• Spring框架学习08——自动代理方式实现AOP


    在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大。
    解决方案:自动创建代理

    • BeanNameAutoProxyCreator 根据Bean名称创建代理
    • DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理
    • AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ注解进行自动代理

    1、基于Bean名称的自动代理

    创建StuDao接口和接口实现类StuDaoImpl
    StuDao接口,代码示例如下:

    public interface StuDao {
        public void save();
        public void modify();
        public void delete();
    }

    StuDaoImpl实现类,代码示例如下:

    public class StuDaoImpl implements StuDao {
        @Override
        public void save() {
            System.out.println("保存");
        }
    
        @Override
        public void modify() {
            System.out.println("修改");
        }
    
        @Override
        public void delete() {
            System.out.println("删除");
        }
    }

    创建CustomDao类,演示不使用接口的实例方式

    public class CustomDao {
        public void add(){
            System.out.println("添加客户");
        }
        public void modify(){
            System.out.println("修改客户");
        }
    }

    创建切面类,实现增强方法

    public class MyBeforeAdvice implements MethodBeforeAdvice {
        @Override
        public void before(Method method, Object[] objects, Object o) throws Throwable {
            System.out.println("前置增强========");
        }
    }

    在applicationContext.xml中配置

    <!--配置目标类-->
    <bean id="stuDao" class="aop.StuDaoImpl"></bean>
    <bean id="customDao" class="aop.CustomDao"></bean>
    <!--配置增强-->
    <bean id="myBeforeAdvice" class="aop.MyBeforeAdvice"></bean>
    <!--配置自动创建代理-->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames" value="*Dao"></property>
        <property name="interceptorNames" value="myBeforeAdvice"></property>
    </bean>

    创建测试类

    @Test
    public void demo(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        StuDao stuDao = (StuDao) app.getBean("stuDao");
        stuDao.save();
        stuDao.modify();
        stuDao.delete();
        CustomDao customDao = (CustomDao) app.getBean("customDao");
        customDao.add();
        customDao.modify();
    }

    运行结果

    2、基于切面信息的自动代理

    StuDao接口,代码示例如下:

    public interface StuDao {
        public void save();
        public void modify();
        public void delete();
    }

    StuDaoImpl实现类,代码示例如下:

    public class StuDaoImpl implements StuDao {
        @Override
        public void save() {
            System.out.println("保存");
        }
    
        @Override
        public void modify() {
            System.out.println("修改");
        }
    
        @Override
        public void delete() {
            System.out.println("删除");
        }
    }

    创建CustomDao类,演示不使用接口的实例方式

    public class CustomDao {
        public void add(){
            System.out.println("添加客户");
        }
        public void modify(){
            System.out.println("修改客户");
        }
    }

    创建切面类,实现环绕增强

    public class MyAspect implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation m) throws Throwable {
            //增强方法
            check();
            //执行目标方法
            Object obj = m.proceed();
            //增强方法
            log();
            return obj;
        }
    
        public void check(){
            System.out.println("模拟权限控制============");
        }
        public void log(){
            System.out.println("模拟日志记录============");
        }
    }

    在applicationContext.xml中配置

    <!--配置目标类-->
    <bean id="stuDao" class="aop.StuDaoImpl"></bean>
    <bean id="customDao" class="aop.CustomDao"></bean>
    <!--配置增强-->
    <bean id="myAroundAdvice" class="aop.MyAspect"></bean>
    <!--配置切面-->
    <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <!--配置要增强的方法,. 表示转义字符-->
        <property name="pattern" value="aop.CustomDao.add"></property>
        <property name="advice" ref="myAroundAdvice"></property>
    </bean>
    <!--配置基于切面自动创建代理-->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

    创建测试类

    @Test
    public void demo(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        StuDao stuDao = (StuDao) app.getBean("stuDao");
        stuDao.save();
        stuDao.modify();
        stuDao.delete();
        CustomDao customDao = (CustomDao) app.getBean("customDao");
        customDao.add();
        customDao.modify();
    }

    运行结果

  • 相关阅读:
    GitHub Actions 支持 "skip ci" 了
    自定义 ocelot 中间件输出自定义错误信息
    小心 Enum Parse 中的坑
    C# 实现一个基于值相等性比较的字典
    浅析 record 使用场景
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    postgresql数据类型
    Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
    重放攻击及防御
    开放 HTTP API 接口签名验证!
  • 原文地址:https://www.cnblogs.com/jpwz/p/10596005.html
Copyright © 2020-2023  润新知