Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何禁用特定bean的Spring自动连接?_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何禁用特定bean的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

jar(外部库)中有一些类在内部使用Spring。 因此库类的结构类似于:

@组件
公共类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
丑陋但有用的解决方法的效果