Применить динамический прокси ко всем классам в приложении

#java #spring #dependency-injection #proxy #dynamic-proxy

#java #spring #внедрение зависимостей #прокси #dynamic-proxy

Вопрос:

Я хочу применить динамический прокси, который я создал, ко всем классам, которые являются частью моего приложения. Но я также хочу иметь возможность использовать внедрение зависимостей (Spring) вместо написания чего-то вроде MyDynamicProxy.newInstance(новая учетная запись ());

Где newInstance является:

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

Как я могу применить внедрение зависимостей и динамический прокси ко всем классам в моем приложении?

Ответ №1:

Вы могли бы попробовать использовать org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization(Object, String) и вернуть свой экземпляр прокси вместо исходного компонента.

ПРИМЕЧАНИЕ. Если вам нужно просто ведение журнала, возможно, было бы проще изучить возможность использования поддержки AOP в Spring, которая позволит вам определить простой аспект ведения журнала для всех управляемых компонентов Spring.

Комментарии:

1. 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 Beans будут прокси, и все выполняемые их методы (по крайней мере, те, которые поддерживаются интерфейсом) будут регистрироваться.

Кстати: Аспекты трассировки рассматриваются в бесплатной главе 10 AspectJ в действии Рамниваса Ладдада