- 浏览: 188354 次
- 性别:
- 来自: 上海
文章分类
最新评论
一般我们可以使用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时使用
现在说下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");
}
mark from http://www.cnblogs.com/65702708/archive/2012/08/14/2638043.html
(一)ProxyFactoryBean属性介绍
target:代理的目标类
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");
}
mark from http://www.cnblogs.com/65702708/archive/2012/08/14/2638043.html
发表评论
文章已被作者锁定,不允许评论。
-
spring boot
2017-11-22 14:12 0spring boot service mesh spring ... -
spring 线程池
2016-07-10 10:26 511一、初始化 1,直接调用 [java] view plai ... -
Reactor、Disruptor
2016-04-27 12:55 1074Reactor 主要用于帮助开发者创建基于JVM的异步应用程序 ... -
mybatis 帮助文档
2016-04-22 11:01 494http://www.mybatis.org/mybatis- ... -
spring mybatis
2016-03-25 15:43 539org.mybatis.spring.SqlSessionTe ... -
mybatis深入
2016-03-21 13:59 482-------Mybatis数据源与连 ... -
关于 mybatis 传参
2016-03-18 10:46 550基本数据类型:包含int,String,Date等。基本数据类 ... -
spring 加载配置文件 xml 和properties
2016-03-17 17:12 2933Spring配置文件是集成了Spring框架的项目的核心,引擎 ... -
spring 事务 提交
2016-03-07 15:16 780如果你不启用事务,默认是自动提交的,不需要设置autoComm ... -
mybatis 、jdbc 、 spring事务模板
2016-03-04 16:22 850mybatis深入: http://b ... -
mybatis 转义字符
2015-11-28 16:23 20521、在xml的sql语句中,不能直接用大于号、小于号要用转义字 ... -
mybatis jdbc 字段映射类型
2015-09-29 14:38 2107mybatis常用jdbcType数据类型 MyBati ... -
org.springframework.jdbc.support.lob.DefaultLobHandler
2015-06-04 10:51 604http://www.ibm.com/developerwor ... -
spring bean 继承与 java 继承异同
2015-01-08 10:36 795bean的定义中可能会包含 ... -
spring 延迟加载与 init-method,afterPropertiesSet和BeanPostProcessor
2015-01-06 10:44 2579ApplicationContext实现的默认行为就是在启动时 ... -
Spring MethodInterceptor
2015-01-05 18:23 795我们知道在Spring中一共提供了四种Advice用来支持对方 ... -
Spring aop 原理及各种应用场景
2015-01-05 17:16 8160AOP是Aspect Oriented Programing的 ... -
ibatis逻辑分页与物理分页
2014-12-31 14:26 581一 直以来ibatis的分页都是通过滚动ResultSet实现 ... -
iBATIS mybatis 配置 说明
2014-12-30 17:27 1448SqlMapClientFactoryBean的主要的几个属性 ... -
mysql 中mybatis 传参与返回参数
2014-12-26 11:11 2018传入参数必须与配置文件中标明的参数一致 如 <selec ...
相关推荐
在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 .........................................................