【问题标题】:What is the difference between ProxyFactory and ProxyFactoryBean in Spring Framework?Spring Framework 中的 ProxyFactory 和 ProxyFactoryBean 有什么区别?
【发布时间】: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


【解决方案1】:

ProxyFactory 独立于 Spring 的 IoC 容器。 ProxyFactoryBean 将 Spring AOP 与 Spring 的 IoC 容器相结合。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 2022-06-21
    • 2010-12-29
    • 1970-01-01
    • 2019-10-19
    • 2011-05-31
    • 2011-04-08
    相关资源
    最近更新 更多