将动态代理应用于应用程序中的所有类

发布于 2024-11-04 15:49:53 字数 399 浏览 4 评论 0原文

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

newInstance 的位置:

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

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

I want to apply the Dynamic Proxy I created to all the classes that are part of my application. But, I also want to be able to use dependency injection (Spring) instead of writing something like MyDynamicProxy.newInstance(new Account());

Where newInstance is:

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

How can I apply Dependency Injection and Dynamic Proxy to all the classes in my application?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风柔一江水 2024-11-11 15:49:53

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

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

You could try using org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization(Object, String) and returning your proxy instance instead of the original bean.

NB if it's just logging you're after, it might be simpler to look into using Spring's AOP support which will allow you to define a simple logging aspect on all Spring managed beans.

第几種人 2024-11-11 15:49:53

不要手动创建代理,请使用 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 将成为代理,并且它们的所有方法执行(至少是由接口支持的方法执行)都将被记录。

顺便说一句: 跟踪方面包含在
的免费第 10 章AspectJ
Ramnivas Laddad 的《行动》

Don't create your proxies manually, use Spring AOP to create your Logging Proxy.

Create a simple Aspect:

@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()));
    }

}

Now wire the aspect in 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>

Now all your Spring Beans will be proxies and all of their method executions (at leaast those backed by an interface) will be logged.

BTW: Tracing Aspects are covered in
the free Chapter 10 of AspectJ
in Action
by Ramnivas Laddad

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文