@autowired(required=false)bean在从另一个模块调用时为空

dw1jzc5e  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(290)

我有两个班,比方说a和b。a在模块1中,b在模块2中。模块1在模块2中编译。在类a中有一个自动连接的bean,required=false。

@Service
public class A implements X{
    @Autowired(required=false)
    private C objectC;
    public String method(){
      //does some processing with methods by objectC.
    }
}

a类在模块2中的b类中自动连接。

@Service
public class B implements Y{
    @Autowired 
    private A objectA;
    public String method(){
       return objectA.method();
    }
}

现在的问题是,当从类b调用类a的method()时,不会注入autowired(required=false)对象。当从同一模块中的另一个类调用同一方法时,会正确地注入同一对象,但从另一个模块调用时,不会注入该对象。

k0pti3hp

k0pti3hp1#

问题是在扫描包时。 @Autowired(required=false) 通知容器在找到bean时注入bean,或者在没有bean的情况下继续(可选的自动连接)。
因此,在模块2中,您必须检查模块1的包是否被正确扫描。这个 @Autowired 没有问题。
例如:

class ClassA {
    @Autowired 
    private Dependency1 dependency1;
    @Autowired(required=false) 
    private Dependency2 dependency2;
    @Autowired(required=false) 
    private Dependency3 dependency3;
}

以下是允许的依赖项组合 ClassA :
依赖性1
依赖1,依赖2
依赖1,依赖3
依赖1,依赖2,依赖3

iszxjhcz

iszxjhcz2#

你确定在你的代码里没有写这样的东西吗

A a = new A();

? 因为如果这样做,autowired对象将为空。请使用objectprovider进行测试,如下所示:

@Autowired
ObjectProvider<A> provider;

if(provider.getIfAvailable()!=null)
provider.getIfAvailable().method();

相关问题