一般我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的编写带来繁重的工作,这时就该BeanNameAutoProxyCreator出场了。
(一)ProxyFactoryBean属性介绍
target:代理的目标类
proxyInterfaces:代理类应该实现的接口列表
interceptorNames:需要应用到目标对象上的通知Bean的名字.可以是拦截器,advisor和其他通知类型的名字。这个属性必须按照在BeanFactory中的顺序设置
singleton:单例
aopProxyFactory:使用的ProxyFactoryBean实现。Spring带有两种实现(JDK动态代理和CGLIB)。通常不需要使用这个属性
exposeProxy:目标对象是否需要得到当前的代理。通过调用AopContext.getCurrentProxy实现。
frozen:一旦工厂被创建,是否可以修改代理的通知。当设置为true时,在运行时就不能修改ProxyFactoryBean了。通常不需要使用这个属性。
optimize:是否对创建的代理进行优化(只适用于CGLIB)
ProxyTargetClass:是否代理目标类,而不是实现接口。只能在使用CGLIB时使用
proxyInterfaces:代理类应该实现的接口列表
interceptorNames:需要应用到目标对象上的通知Bean的名字.可以是拦截器,advisor和其他通知类型的名字。这个属性必须按照在BeanFactory中的顺序设置
singleton:单例
aopProxyFactory:使用的ProxyFactoryBean实现。Spring带有两种实现(JDK动态代理和CGLIB)。通常不需要使用这个属性
exposeProxy:目标对象是否需要得到当前的代理。通过调用AopContext.getCurrentProxy实现。
frozen:一旦工厂被创建,是否可以修改代理的通知。当设置为true时,在运行时就不能修改ProxyFactoryBean了。通常不需要使用这个属性。
optimize:是否对创建的代理进行优化(只适用于CGLIB)
ProxyTargetClass:是否代理目标类,而不是实现接口。只能在使用CGLIB时使用
现在说下ProxyBeanFactory的用法以及配置:
ITest.class
public interface ITest {
void tst();
void tst(int status,String name);
}
TestProxyFactoryBean.class
public class TestProxyFactoryBean implements ITest { @Override
public void tst() {
// TODO Auto-generated method stub
System.out.println("执行方法.");
} @Override
public void tst(int status, String name) {
System.out.println("tst(int status, String name)" );
} }
LoggerAdvice.class
/**
* 日志代理
* @author Administrator
*
*/
public class LoggerAdvice implements MethodBeforeAdvice, AfterReturningAdvice { @Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
Logger logger = Logger.getLogger(target.getClass());
if(returnValue != null){
logger.debug("+-------Return : " + returnValue.toString());
}
} @Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
Logger logger = Logger.getLogger(target.getClass());
logger.debug("+Class : "+ target.getClass().getName());
logger.debug("+-------Method : "+ method.getName());
for(int i=0; i<args.length; i++){
logger.debug(" +-arg"+ i + " : " + args[i].toString());
}
} }
Xml配置:
<bean class="spring.aop.TestProxyFactoryBean" id="testproxyfactorybean"/> <bean class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="spring.aop.ITest"></property>
<property name="interceptorNames" > <list>
<value>loggerAdvice</value>
</list> </property> <property name="target" ref="testproxyfactorybean"></property>
</bean>
Program.class
public static void main(String[] args){
context.getBean("proxyBean",ITest.class).tst();
context.getBean("proxyBean",ITest.class).tst(1,"123");
}
执行结果:
2012-08-14 14:57:30 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[DEBUG] Returning cached instance of singleton bean 'proxyBean'
2012-08-14 14:57:30 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[DEBUG] Returning cached instance of singleton bean 'loggerAdvice'
2012-08-14 14:57:30 [org.springframework.aop.framework.ProxyFactoryBean]-[DEBUG] Advice has changed; recaching singleton instance
2012-08-14 14:57:30 [org.springframework.aop.framework.JdkDynamicAopProxy]-[DEBUG] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [spring.aop.TestProxyFactoryBean@11978b]
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +Class : spring.aop.TestProxyFactoryBean
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +-------Method : tst
执行方法.
2012-08-14 14:57:30 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[DEBUG] Returning cached instance of singleton bean 'proxyBean'
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +Class : spring.aop.TestProxyFactoryBean
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +-------Method : tst
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +-arg0 : 1
2012-08-14 14:57:30 [spring.aop.TestProxyFactoryBean]-[DEBUG] +-arg1 : 123
tst(int status, String name)
(二)BeanNameAutoProxyCreator属性介绍
target:代理的目标类
beanNames:需要代理的bean的列表
interceptorNames:需要应用到目标对象上的通知Bean的名字.可以是拦截器,advisor和其他通知类型的名字。这个属性必须按照在BeanFactory中的顺序设置
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<value>loggerAdvice</value>
</list>
</property>
<property name="beanNames">
<list>
<idref local="testproxyfactorybean" />
</list>
</property>
</bean>
调用代码:
public static void main(String[] args){
context.getBean("testfunc",TestFunc.class).test("project", 100);
context.getBean("testfunc",TestFunc.class).test1("project1");
}
aaarticlea/png;base64,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" alt="" />
出处:http://www.cnblogs.com/65702708/archive/2012/08/14/2638043.html