来源:http://www.cnblogs.com/65702708/archive/2012/08/14/2638043.html
一般我们可以使用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);
}
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)" );
}
}
@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());
}
}
}
* 日志代理
* @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");
}
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)
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>
<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");
}
context.getBean("testfunc",TestFunc.class).test("project", 100);
context.getBean("testfunc",TestFunc.class).test1("project1");
}
相关推荐
在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,用于解耦核心业务逻辑与关注点,如日志、事务管理等。`BeanNameAutoProxyCreator`是Spring AOP实现中的一种代理创建器,它根据bean的名称来决定是否对...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用...
- `BeanNameAutoProxyCreator`的配置文件,将`UserService`与`LoggingAspect`关联起来。 四、应用场景 `BeanNameAutoProxyCreator`常用于以下场景: - 日志记录:在方法调用前后记录信息,帮助追踪和调试。 - 性能...
BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator <br> 持久层 来看看 Spring 的 IoC 容器与 AOP 框架如何应用于持久层,包括了资料库、交易等相关议题。 资料库存取 Spring ...
与`BeanNameAutoProxyCreator`不同,它不依赖于bean名称,而是依赖于advisor的pointcut定义。这意味着只要advisor的pointcut能够匹配到某个bean的方法,那么该bean就会被自动代理。这种方式更加通用,适合于大部分...
Spring 事务管理也可以与AOP结合,通过`aop:config`标签定义切点和通知,来实现事务的声明式管理。这种方式更加灵活,可以实现更细粒度的事务控制。 在实际开发中,根据项目需求和团队习惯,可以选择适合的事务...
14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置...
前者用于保护Spring容器中的业务对象,通过使用ProxyFactoryBean或BeanNameAutoProxyCreator,可以实现对Bean的代理和安全管理;后者则通过过滤器保护HTTP资源,开发者只需在web.xml中添加相应的Filter配置,即可...
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 指定对满足哪些beanname的bean自动生成业务代理 --> <!-- 下面是所有需要自动创建事务代理的bean --> <value>...
3. **使用DefaultAdvisorAutoProxyCreator**:与`BeanNameAutoProxyCreator`类似,但其配置的可读性可能稍逊一筹。 #### 总结 在Spring框架中,声明式事务管理是一种强大而灵活的事务处理方式,尤其是通过`...
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <value>tempService <value>transactionInterceptor ``` 在上面的代码中,我们定义了一个代理bean,这...
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 指定对满足哪些bean name的bean自动生成业务代理 --> <!-- 下面是所有需要自动创建事务代理的bean--> ...
在Spring配置文件中,首先需要定义一个事务管理器,该管理器负责与特定的数据访问技术(如Hibernate、JDBC等)进行交互,处理事务的开启、提交或回滚等操作。例如,如果使用Hibernate作为持久层框架,则可以定义如下...
14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置...
BeanNameAutoProxyCreator BeanNameAware BeanNameUrlHandlerMapping BeanNameViewResolver BeanNotOfRequiredTypeException BeanPostProcessor BeanPropertyBindingResult BeanPropertySqlParameterSource ...
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> *Service <value>transactionInterceptor1 <value>transactionInterceptor2 ``` 接...
<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> ``` 最后,`autoproxy` Bean 是一个自动代理创建器,它会为 `purviewimpl` 这个 Bean 创建一个代理...
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................