【问题标题】:Apply Dynamic Proxy to all the classes in an application将动态代理应用于应用程序中的所有类
【发布时间】:2011-05-04 08:33:32
【问题描述】:

我想将我创建的动态代理应用到属于我的应用程序的所有类。但是,我也希望能够使用依赖注入 (Spring) 而不是编写类似 MyDynamicProxy.newInstance(new Account());

newInstance 在哪里:

public static Object newInstance(Object object) {             
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),new LoggingProxy(object));        
}  

如何将依赖注入和动态代理应用到我的应用程序中的所有类?

【问题讨论】:

    标签: java spring dependency-injection proxy dynamic-proxy


    【解决方案1】:

    您可以尝试使用 org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization(Object, String) 并返回您的代理实例而不是原始 bean。

    注意,如果它只是记录您所追求的,那么使用 Spring 的 AOP 支持可能会更简单,这将允许您在所有 Spring 托管 bean 上定义一个简单的日志记录方面。

    【讨论】:

    • +1 用于 BeanPostProcessor。虽然我不建议这样做,但很高兴知道有不止一种方法可以做到这一点
    【解决方案2】:

    不要手动创建您的代理,使用Spring AOP 来创建您的日志代理。

    创建一个简单的方面:

    @Aspect
    public class LoggingAspect{
    
        private static final Logger log = Logger.getLogger(LoggingAspect.class);
    
        @Pointcut("execution(* *.*(..))")
        public void methodExecution(){
        }
    
        @Before("methodExecution()")
        public void logBeforeMethod(final JoinPoint joinPoint){
            log.trace("Entering method " + joinPoint.getSignature() + " with args "
                + Arrays.toString(joinPoint.getArgs()));
        }
    
    }
    

    现在在 Spring 中连接方面:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    
        <bean class="aspects.LoggingAspect" />
        <aop:aspectj-autoproxy />
    
    </beans>
    

    现在您的所有 Spring Bean 都将成为代理,并且它们的所有方法执行(至少由接口支持的那些)都将被记录。

    顺便说一句: 跟踪方面包含在 the free Chapter 10 of AspectJ in Action 作者 Ramnivas Laddad

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      相关资源
      最近更新 更多