【发布时间】:2017-11-04 14:39:26
【问题描述】:
我有以下示例代码:
MyMethodBeforeAdviceImpl.java
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class MyMethodBeforeAdviceImpl implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("MyMethodBeforeAdviceImpl#before");
}
}
MyService.java
public interface MyService {
void serve();
}
MyServiceImpl.java
public class MyServiceImpl implements MyService {
@Override
public void serve() {
System.out.println("MyServiceImpl#serve");
}
}
最后是 App.java
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.framework.ProxyFactoryBean;
public class App {
public static void main(String[] args) {
final MyServiceImpl myService = new MyServiceImpl();
final MethodBeforeAdvice myMethodBeforeAdvice = new MyMethodBeforeAdviceImpl();
final ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.addAdvice(myMethodBeforeAdvice);
proxyFactory.setTarget(myService);
MyService proxyServiceFromFactory = (MyService) proxyFactory.getProxy();
proxyServiceFromFactory.serve();
final ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.addAdvice(myMethodBeforeAdvice);
proxyFactoryBean.setTarget(myService);
MyService proxyServiceFromFactoryBean = (MyService) proxyFactoryBean.getObject();
proxyServiceFromFactoryBean.serve();
System.exit(-1);
}
}
main 方法的输出将是:
MyMethodBeforeAdviceImpl#before
MyServiceImpl#serve
MyMethodBeforeAdviceImpl#before
MyServiceImpl#serve
就这个非常小的示例而言,它们的用途完全相同。 ProxyFactory documentation 声明:
AOP 代理的工厂用于编程使用,而不是通过 bean 工厂中的声明式设置。这个类提供了一个简单的方法 在自定义用户代码中获取和配置 AOP 代理实例。
但在我看来,您也可以将 ProxyFactoryBean 用于相同目的?
这 2 个类如何服务于不同的目的?
【问题讨论】:
-
ProxyFactoryBean本质上与ProxyFactory相同(它们具有相同的超类)。它只是另外实现了FactoryBean,所以 Spring 可以控制它的生命周期。
标签: java spring spring-aop