Применить динамический прокси ко всем классам в приложении - PullRequest
1 голос
/ 04 мая 2011

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

Где newInstance:

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

Как я могу применить Dependency Injection и Dynamic Proxy ко всем классам в моем приложении?

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Не создавайте прокси вручную, используйте 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()));
    }

}

Теперь подключите аспект весной:

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

1 голос
/ 04 мая 2011

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

Примечание: если вы просто регистрируете, что вам нужно, возможно, было бы проще взглянуть на использование поддержки Spring AOP, которая будетпозволяет определить простой аспект ведения журнала для всех управляемых bean-компонентов Spring.

...