我有以下示例代码:
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);
}
}主要方法的输出如下:
MyMethodBeforeAdviceImpl#before
MyServiceImpl#serve
MyMethodBeforeAdviceImpl#before
MyServiceImpl#serve因此,就这个非常小的例子而言,它们的作用完全相同。ProxyFactory文档指出:
用于编程使用的AOP代理工厂,而不是通过bean工厂中的声明性设置。该类提供了一种在自定义用户代码中获取和配置AOP代理实例的简单方法。
但在我看来,你还是为了同样的目的而使用ProxyFactoryBean吧?
这两个类是如何达到不同目的的?
发布于 2018-07-21 07:34:25
ProxyFactory独立于Spring的IoC容器。ProxyFactoryBean正在将Spring与Spring的IoC容器结合起来。
https://stackoverflow.com/questions/47111867
复制相似问题