java – Spring:委托自定义代理包装器进行接口注入

前端之家收集整理的这篇文章主要介绍了java – Spring:委托自定义代理包装器进行接口注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在一个非常大的遗留应用程序中,我有没有实现这些接口的接口和类.

接口是基于类生成的,因此签名是相同的(除了接口在顶部添加另一个异常)并且名称相似(因此很容易从接口名称中找到类名).

为了获得接口的实现,我们做了一堆处理和记录调用,但基本上使用java.lang.reflect.Proxy委托给类.简化它看起来像这样:

// This will create a proxy and invoke handler that calls HelloWorld.doSomething
HelloWorldInterface i = MyProxyUtil.getInstance(HelloWorldInterface.class);
i.doSomething();

public interface HelloWorldInterface {
    public void doSomething() throws Exception;  
}

public class HelloWorld {
    public void doSomething() {
     //something
    }
}

是否有可能使用Spring注释处理,一般@Autowire所有类型*接口的字段并且有春天使用MyProxyUtil.getInstance(* Interface.class)注入实现?

这样

@Autowire HelloWorldInterface a;

HelloWorldInterface b = MyProxyUtil.getInstance(HelloWorldInterface.class);

@Autowire AnotherInterface c;

AnotherInterface d = MyProxyUtil.getInstance(AnotherInterface.class);


a == b
c == d
最佳答案
是的,您需要实现AutowireCandidateResolver.

例如:

public class ProxyAutowiredCandidateResolver extends SimpleAutowireCandidateResolver {

    @Override
    public Object getSuggestedValue(DependencyDescriptor descriptor) {
        String dependencyClassName = descriptor.getDependencyType().getSimpleName();
        if (dependencyClassName.endsWith("Interface")) {
            return MyProxyUtil.getInstance(descriptor.getDependencyType());
        }

        return super.getSuggestedValue(descriptor);
    }

}

您可以使用beanfactoryPostProcessor在应用程序上下文中配置它:

public class AutowireCandidateResolverConfigurer implements beanfactoryPostProcessor {

    private AutowireCandidateResolver autowireCandidateResolver;

    public void postProcessbeanfactory(
            ConfigurableListablebeanfactory beanfactory) throws BeansException {
        DefaultListablebeanfactory  bf = (DefaultListablebeanfactory) beanfactory;
        bf.setAutowireCandidateResolver(autowireCandidateResolver);


    }

    public AutowireCandidateResolver getAutowireCandidateResolver() {
        return autowireCandidateResolver;
    }

    public void setAutowireCandidateResolver(

            AutowireCandidateResolver autowireCandidateResolver) {
        this.autowireCandidateResolver = autowireCandidateResolver;
    }

}

猜你在找的Spring相关文章