#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 в действии Рамниваса Ладдада