Spring 自动代理
2024-09-05 19:40:21
在传统的基于代理类的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
最新文章
- HP ALM 使用经验
- JS-sort排序
- Linux学习笔记(23) Linux备份
- fragment的生命周期及其各个周期方法的作用
- Unity5网络模块UNet介绍
- Java之循环语句练习1
- C# 正则表达式 学习笔记二
- 导出Excel后其他按钮失效
- 无法解析属性“mode”的值。错误为: 枚举值必须是以下各值中的一个: RemoteOnly, On, Off。
- ubuntu apt 命令参数(转)
- HDU1058 Humble Numbers 【数论】
- CORS跨域资源共享
- JS的事件多次触发,只执行最后一次
- cocos2dx 从2.2.6 到3.16 升级流水记录
- VS2017使用文档
- 使用Java+Kotlin双语言的LeetCode刷题之路(二)
- 从字符集发展史看Unicode和UTF-8的区别
- IDEA 导出项目war包
- java集合之List源码解析
- php libev扩展使用
热门文章
- 2018.03.29 python-pandas 数据读取
- vim加脚本注释和文本加密
- linux sed 命令 实现对文件的增删改替换查 实验
- mybatis中resultMap的使用
- MySql日期加天数,小时,分钟...得到新的时间
- Linux的磁盘配额详解(Quota)
- Larkin’s NOI
- ARM之cache
- Fedora添加软件桌面快捷方式
- Client does not support authentication protocol requested by server; consider upgrading MySQL client