在传统的基于代理类的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();
}

运行结果

转自:https://www.cnblogs.com/jpwz/p/10596005.html

最新文章

  1. HP ALM 使用经验
  2. JS-sort排序
  3. Linux学习笔记(23) Linux备份
  4. fragment的生命周期及其各个周期方法的作用
  5. Unity5网络模块UNet介绍
  6. Java之循环语句练习1
  7. C# 正则表达式 学习笔记二
  8. 导出Excel后其他按钮失效
  9. 无法解析属性“mode”的值。错误为: 枚举值必须是以下各值中的一个: RemoteOnly, On, Off。
  10. ubuntu apt 命令参数(转)
  11. HDU1058 Humble Numbers 【数论】
  12. CORS跨域资源共享
  13. JS的事件多次触发,只执行最后一次
  14. cocos2dx 从2.2.6 到3.16 升级流水记录
  15. VS2017使用文档
  16. 使用Java+Kotlin双语言的LeetCode刷题之路(二)
  17. 从字符集发展史看Unicode和UTF-8的区别
  18. IDEA 导出项目war包
  19. java集合之List源码解析
  20. php libev扩展使用

热门文章

  1. 2018.03.29 python-pandas 数据读取
  2. vim加脚本注释和文本加密
  3. linux sed 命令 实现对文件的增删改替换查 实验
  4. mybatis中resultMap的使用
  5. MySql日期加天数,小时,分钟...得到新的时间
  6. Linux的磁盘配额详解(Quota)
  7. Larkin’s NOI
  8. ARM之cache
  9. Fedora添加软件桌面快捷方式
  10. Client does not support authentication protocol requested by server; consider upgrading MySQL client