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();
}

运行结果

posted @ 2019-03-25 19:47  Web1024  阅读(598)  评论(0编辑  收藏  举报