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