[b]1、我理解的Spring AOP[/b]
AOP其实就是划分出来了一个切面,然后在这个切面里面进行了一些增强,最后产生一个增加了新功能的[color=blue][b]代理对象[/b][/color],注意,是代理对象,这是Spring AOP实现的基础。这个对象只不过比原始对象(Bean)多了一些功能而已,比如Bean预处理,Bean后处理,异常处理等。
[b]2、简单的Demo理解Spring AOP[/b]
首先定义一个AOP代理工厂AOPProxyFactory,这个工厂产生增强后的代理对象。
然后定义before增强
最后使用代理工厂产生一个业务Bean的代理
原理就是这么简单:InvocationHandler--MethodBeforeAdvice--invoke
这里是在方法嗲调用前增强,当然也可以在方法调用后增强、方法抛出异常时增强。
[b]3、在Spring中实现的AOP[/b]
上面的例子是我的一个demo,以说明Spring的AOP实现原理。实际上Spring有一个org.springframework.aop.framework.ProxyFactoryBean接口,可以注入target(欲增强的对象)、interceptorNames(拦截器的一个list)属性,从而实现AOP。
示例中的MethodBeforeAdvice可以对代理对象的任何方法进行增强,也就是说,Advice只实现了功能的扩展,而没有拦截器的功能(事实上是拦截了所有的方法),而实际中并不需要这样,下面介绍针对特定方法的增强。
[b]4、只拦截特定的方法[/b]
使用Spring的PointCutAdvisor。一个Advisor定义了一个Pointcut和一个Advice,满足Poincut(指定了哪些方法需要增强),则执行相应的Advice(定义了增强的功能)。
有两个常用的实现类:
NameMacthMethodPointCutAdvisor、RegexpMethodPointCutAdvisor
前者需要注入mappedName和advice属性,后者需要注入pattern和advice属性。
mappedName指明了要拦截的方法名,pattern按照正则表达式的方法指明了要拦截的方法名,advice定义了一个增强(需要自己实现MethodBeforeAdvice、MethodAfterAdvice、ThrowsAdvice、MethodInterceptor接口之一)。然后在ProxyFactoryBean的拦截器(interceptorNames)中注入这个PointCutAdvisor即可。
最后将PointCutAdvisor和(或)Advice装配到ProxyFactoryBean中即可。
ProxyFactoryBean中可同时注入Advisor和Advice,只不过二者的拦截不一样而已。
注意:一个ProxyFactoryBean只能指定一个代理目标,不是很方便,第2节将介绍自动代理,方便配置。
AOP其实就是划分出来了一个切面,然后在这个切面里面进行了一些增强,最后产生一个增加了新功能的[color=blue][b]代理对象[/b][/color],注意,是代理对象,这是Spring AOP实现的基础。这个对象只不过比原始对象(Bean)多了一些功能而已,比如Bean预处理,Bean后处理,异常处理等。
[b]2、简单的Demo理解Spring AOP[/b]
首先定义一个AOP代理工厂AOPProxyFactory,这个工厂产生增强后的代理对象。
public class AOPProxyFactory{
public static Object createProxy(Object target,MethodBeforeAdvice mbAdvice){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){//拦截器
public Object invoke()(Object proxy,Method m,Object[] args) throws Throwable{
mbAdvice.before(m,args,target);//方法执行前增强
return m.invoke(target,args);//方法调用
}
});
}
然后定义before增强
MethodBeforeAdvice mbAdvice =new MethodBeforeAdvice(){
public before(Method m,Object[] args,Object target){
do something;
}
};
最后使用代理工厂产生一个业务Bean的代理
UserserviceImpl target=new UserserviceImpl();//待增强的原始业务bean,在Spring中并非new出来,而是使用IOC注入Userservice接口中的
Userservice us= (Userservice)AOPProxyFactory.create(target,mbAdvice);
us.login(username,password);//us即为代理对象,此方法执行时,会首先执行before()
原理就是这么简单:InvocationHandler--MethodBeforeAdvice--invoke
这里是在方法嗲调用前增强,当然也可以在方法调用后增强、方法抛出异常时增强。
[b]3、在Spring中实现的AOP[/b]
上面的例子是我的一个demo,以说明Spring的AOP实现原理。实际上Spring有一个org.springframework.aop.framework.ProxyFactoryBean接口,可以注入target(欲增强的对象)、interceptorNames(拦截器的一个list)属性,从而实现AOP。
示例中的MethodBeforeAdvice可以对代理对象的任何方法进行增强,也就是说,Advice只实现了功能的扩展,而没有拦截器的功能(事实上是拦截了所有的方法),而实际中并不需要这样,下面介绍针对特定方法的增强。
[b]4、只拦截特定的方法[/b]
使用Spring的PointCutAdvisor。一个Advisor定义了一个Pointcut和一个Advice,满足Poincut(指定了哪些方法需要增强),则执行相应的Advice(定义了增强的功能)。
有两个常用的实现类:
NameMacthMethodPointCutAdvisor、RegexpMethodPointCutAdvisor
前者需要注入mappedName和advice属性,后者需要注入pattern和advice属性。
mappedName指明了要拦截的方法名,pattern按照正则表达式的方法指明了要拦截的方法名,advice定义了一个增强(需要自己实现MethodBeforeAdvice、MethodAfterAdvice、ThrowsAdvice、MethodInterceptor接口之一)。然后在ProxyFactoryBean的拦截器(interceptorNames)中注入这个PointCutAdvisor即可。
<bean id="loginBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="pattern" value=".*UserService\.login"/>
<property name="advice">
<bean class="com.xxx.LoginBeforeAdvice"/>
</property>
</bean>
最后将PointCutAdvisor和(或)Advice装配到ProxyFactoryBean中即可。
ProxyFactoryBean中可同时注入Advisor和Advice,只不过二者的拦截不一样而已。
<bean id="userService" class="org.spring.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<list>
<value>loginBeforeAdvisor</value>
<value>loginThrowsAdvice</value>
...
</list>
</property>
<property name="target" ref="targetService"/>
</bean>
注意:一个ProxyFactoryBean只能指定一个代理目标,不是很方便,第2节将介绍自动代理,方便配置。