`

Spring BeanNameAutoProxyCreator 与 ProxyFactoryBean

    博客分类:
  • SSIH
 
阅读更多
一般我们可以使用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
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    AOP usage -- BeanNameAutoProxyCreator usage

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,用于解耦核心业务逻辑与关注点,如日志、事务管理等。`BeanNameAutoProxyCreator`是Spring AOP实现中的一种代理创建器,它根据bean的名称来决定是否对...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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. 使用...

    Spring实现自动代理Demo

    - `BeanNameAutoProxyCreator`的配置文件,将`UserService`与`LoggingAspect`关联起来。 四、应用场景 `BeanNameAutoProxyCreator`常用于以下场景: - 日志记录:在方法调用前后记录信息,帮助追踪和调试。 - 性能...

    开源框架 Spring Gossip

    BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator &lt;br&gt; 持久层 来看看 Spring 的 IoC 容器与 AOP 框架如何应用于持久层,包括了资料库、交易等相关议题。 资料库存取 Spring ...

    spring代理详解.txt

    与`BeanNameAutoProxyCreator`不同,它不依赖于bean名称,而是依赖于advisor的pointcut定义。这意味着只要advisor的pointcut能够匹配到某个bean的方法,那么该bean就会被自动代理。这种方式更加通用,适合于大部分...

    spring 事务(6中配置完全降解)

    Spring 事务管理也可以与AOP结合,通过`aop:config`标签定义切点和通知,来实现事务的声明式管理。这种方式更加灵活,可以实现更细粒度的事务控制。 在实际开发中,根据项目需求和团队习惯,可以选择适合的事务...

    Spring.3.x企业应用开发实战(完整版).part2

    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安全系统:Acegi Security--星月夜

    前者用于保护Spring容器中的业务对象,通过使用ProxyFactoryBean或BeanNameAutoProxyCreator,可以实现对Bean的代理和安全管理;后者则通过过滤器保护HTTP资源,开发者只需在web.xml中添加相应的Filter配置,即可...

    Spring在Transaction事务传播行为种类

    &lt;bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; &lt;!-- 指定对满足哪些beanname的bean自动生成业务代理 --&gt; &lt;!-- 下面是所有需要自动创建事务代理的bean --&gt; &lt;value&gt;...

    spring 事务代理配置

    3. **使用DefaultAdvisorAutoProxyCreator**:与`BeanNameAutoProxyCreator`类似,但其配置的可读性可能稍逊一筹。 #### 总结 在Spring框架中,声明式事务管理是一种强大而灵活的事务处理方式,尤其是通过`...

    Spring_Hibernate使用TransactionInterceptor声明式事务配置.doc

    &lt;bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; &lt;value&gt;tempService &lt;value&gt;transactionInterceptor ``` 在上面的代码中,我们定义了一个代理bean,这...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; &lt;!-- 指定对满足哪些bean name的bean自动生成业务代理 --&gt; &lt;!-- 下面是所有需要自动创建事务代理的bean--&gt; ...

    spring1.2申明式事务.txt

    在Spring配置文件中,首先需要定义一个事务管理器,该管理器负责与特定的数据访问技术(如Hibernate、JDBC等)进行交互,处理事务的开启、提交或回滚等操作。例如,如果使用Hibernate作为持久层框架,则可以定义如下...

    Spring3.x企业应用开发实战(完整版) part1

    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 API 2.0.CHM

    BeanNameAutoProxyCreator BeanNameAware BeanNameUrlHandlerMapping BeanNameViewResolver BeanNotOfRequiredTypeException BeanPostProcessor BeanPropertyBindingResult BeanPropertySqlParameterSource ...

    Spring+Ibatis 访问多个数据源

    &lt;bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; *Service &lt;value&gt;transactionInterceptor1 &lt;value&gt;transactionInterceptor2 ``` 接...

    spring拦截器的简单例子.docx

    &lt;bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; ``` 最后,`autoproxy` Bean 是一个自动代理创建器,它会为 `purviewimpl` 这个 Bean 创建一个代理...

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

Global site tag (gtag.js) - Google Analytics