Java 如何禁用特定bean的Spring自动连接?
jar(外部库)中有一些类在内部使用Spring。 因此库类的结构类似于:Java 如何禁用特定bean的Spring自动连接?,java,spring,spring-boot,Java,Spring,Spring Boot,jar(外部库)中有一些类在内部使用Spring。 因此库类的结构类似于: @组件 公共类TestBean{ @自动连线 私有测试依赖; ... } 该库提供用于构造对象的API: 公共类库{ 公共静态TestBean createBean(){ ApplicationContext上下文=新注释配置ApplicationContext(springConfigs); 返回context.getBean(TestBean); } } 在我的应用程序中,我有配置: @配置 公共类TestCon
@组件
公共类TestBean{
@自动连线
私有测试依赖;
...
}
该库提供用于构造对象的API:
公共类库{
公共静态TestBean createBean(){
ApplicationContext上下文=新注释配置ApplicationContext(springConfigs);
返回context.getBean(TestBean);
}
}
在我的应用程序中,我有配置:
@配置
公共类TestConfig{
@豆子
公共TestBean(){
返回Library.createBean();
}
}
抛出一个异常:TestBean中的字段依赖项需要一个找不到的TestDependency类型的bean。
但是Spring不应该尝试注入一些东西,因为bean已经配置好了
我可以为某个bean禁用Spring自动连线吗?不完全可以,但是您可以在自动连线注释中添加required=false
(@Autowired(required=false))
。但是要小心,可能会导致null指针异常对于特定的bean,似乎不可能禁用自动连接
所以有一些解决办法。
我们可以为目标bean制作包装器,并使用它代替原始bean:
公共类TestBeanRapper{
私人最终测试豆;
公共TestBeanRapper(TestBean){
this.bean=bean;
}
公共TestBean(){
返回豆;
}
}
@配置
公共类TestConfig{
@豆子
公共TestBeanRapperBean(){
返回新的TestBeanRapper(Library.createBean());
}
}
@RestController
公共类测试控制器{
@自动连线
私家菜豆菜豆;
...
}
这对我很有用:
import org.springframework.beans.factory.FactoryBean;
...
@Configuration
public class TestConfig {
@Bean
public FactoryBean<TestBean> bean() {
TestBean bean = Library.createBean();
return new FactoryBean<TestBean>()
{
@Override
public TestBean getObject() throws Exception
{
return bean;
}
@Override
public Class<?> getObjectType()
{
return TestBean.class;
}
@Override
public boolean isSingleton()
{
return true;
}
};
}
}
import org.springframework.beans.factory.FactoryBean;
...
@配置
公共类TestConfig{
@豆子
公共FactoryBean(){
TestBean=Library.createBean();
返回新的FactoryBean()
{
@凌驾
公共TestBean getObject()引发异常
{
返回豆;
}
@凌驾
公共类getObjectType()
{
返回TestBean.class;
}
@凌驾
公共布尔isSingleton()
{
返回true;
}
};
}
}
根据@Juan的回答,创建了一个帮助器来包装一个不自动连接的bean:
public static <T> FactoryBean<T> preventAutowire(T bean) {
return new FactoryBean<T>() {
public T getObject() throws Exception {
return bean;
}
public Class<?> getObjectType() {
return bean.getClass();
}
public boolean isSingleton() {
return true;
}
};
}
...
@Bean
static FactoryBean<MyBean> myBean() {
return preventAutowire(new MyBean());
}
公共静态FactoryBean防Autowire(T bean){
返回新的FactoryBean(){
public T getObject()引发异常{
返回豆;
}
公共类getObjectType(){
返回bean.getClass();
}
公共布尔isSingleton(){
返回true;
}
};
}
...
@豆子
静态FactoryBean myBean(){
返回Autowire(新的MyBean());
}
你怎么知道bean已经配置好了?既然Library.createBean()
正在创建你的对象,为什么你要把@Autowired放在TestDependency
上面,那不是我。这是一个库源代码。@randomInstanceFlivingThing,因为library.createBean
在内部使用Spring。可能是在组件扫描类路径中找不到TestDependency吗?我找不到<代码> TestBebean 这是一个来自库源代码的类。恐怕您必须使用XML方法来创建TestApple中的TestApple,并标记它为AutoWeRealEdvay= false,那么如果我标记“AutoWrand(Read=false)),它将不会考虑AutoWiRIGIN。然后,它将始终为null还是尝试自动连接,如果失败,则继续?@jDub9:检查asg的注释IMO-问题是TestConfig和Library创建的spring上下文,两者都不同。此外,如果您想将第三方组件加载到您的系统中,最好的方法是配置它的xml文件,而不是使用组件扫描加载。
u需要导入您的库的ur scan软件包xml文件。该技巧有效。但请注意,bean不会被代理包装,即启用@Validated
或@Transactional
丑陋但有用的解决方法的效果