一、编程式增强
不借助spring的配置,通过自己实例化对象来实现的增强方式
创建增强类,需要实现你需要的增强接口,(只有实现了该接口,这个类就是一个通知))
1 /** 2 * 增强类 3 */ 4 public class Advice implements MethodBeforeAdvice, AfterReturningAdvice { 5 @Override 6 public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { 7 System.out.println("我是后置增强"); 8 } 9 10 @Override 11 public void before(Method method, Object[] objects, Object o) throws Throwable { 12 System.out.println("我是前置增强"); 13 } 14 }
创建接口定义一个dosome方法
public interface DoSome { void dosome(); }
创建接口的上诉接口的实现类DoSomeImpl在控制台输出一句话
public class DoSomeImpl implements DoSome{ public void dosome(){ System.out.println("我是service层"); } }
创建测试类
public class Dome { public static void main(String[] args) { //获取代理工厂 ProxyFactory pf = new ProxyFactory(); //将实现类set进去 pf.setTarget(new DoSomeImpl()); //将通知类减价进去 pf.addAdvice(new Advice()); //通过代理工厂获取对象的实例 DoSome ds =(DoSome) pf.getProxy(); ds.dosome();//执行方法 } }
以上就是编程式增强的简单实现,可见编程式增强配置性很差,而且有spring为什么不用,辣么方便
二、声明式增强
利用spring的ioc机制为ProxyFactory进行注入,这样可配置性就高了许多,毕竟项目大了,在很多个.java文件中去找几个ProxyFactory式很困难的,如果只是找配置文件的话就舒服多了。废话不多说了,上代码了(由于通知和service层代码与编程时增强相同,这里就不重复写了只写配置文件和测试类)
配置文件applicationContext.xml的基本配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--创建service层的bean--> <bean id="service" class="service.DoSomeImpl"></bean> <!--创建通知的bean--> <bean id="advice" class="advice.Advice"></bean> <!--创建代理工厂bean,并注入属性--> <bean id="factoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--注入service实现类的bean--> <property name="target" ref="service"/> <!--注入通知的bean,注意这里不使用ref注入,只能是value属性,属性为通知类bean的id属性--> <property name="interceptorNames" value="advice"/> </bean> </beans>
测试类改写为
1 public class Dome { 2 public static void main(String[] args) { 3 ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); 4 DoSome proxyFactory = (DoSome) context.getBean("factoryBean");//这里注入的是ProxyFactoryBean的id属性值 5 proxyFactory.dosome(); 6 } 7 }
了解动态代理的大佬应该看的出,这里都是借助动态代理。说白了,动态代理就是spring的大脑,没了动态代理,spring就不是spring了