Spring---依赖注入问题

配置类中,手动new 对象

@Configuration
public class TestConfig {


    @Bean
    public TestInterface testInterface(){
        System.out.println("init testInterface");
        return buildTestInterfaceImpl();
    }

    @Bean("testInterfaceName")
    public TestInterfaceName testInterfaceName(){
        System.out.println("init testInterfaceName");
        return new TestInterfaceNameImpl();
    }

    private TestInterface buildTestInterfaceImpl() {
        TestInterfaceImpl testInterface = new TestInterfaceImpl();   -- 手动创建Bean
        testInterface.init();
        return testInterface;
    }

}


public interface TestInterface {

    void test();

}


public class TestInterfaceImpl implements TestInterface{

    @Autowired
    private TestInterfaceName testInterfaceName;     -- @Autowired注入依赖TestInterfaceName


    @Override
    public void test() {

    }

    public void init(){
        System.out.println("init:"+ testInterfaceName);
    }
}


public interface TestInterfaceName {

    void test();
}


public class TestInterfaceNameImpl implements TestInterfaceName{
    @Override
    public void test() {

    }
}
    @Override
    public void test() {

    }
}

  

  

  

  初始化结果:

    init testInterfaceName
    init testInterface
    init:null

  

  由于手动new对象,不在spring的Bean容器管理,可能会导致手动new 对象的依赖注入失效;

 

解决

  将手动new 对象的依赖使用构造器注入方式,使得手动创建的对象是完整的对象

@Configuration
public class TestConfig {

    @Bean
    public TestInterface testInterface(TestInterfaceName testInterfaceName){
        System.out.println("init testInterface");
        return buildTestInterfaceImpl(testInterfaceName);
    }

    @Bean("testInterfaceName")
    public TestInterfaceName testInterfaceName(){
        System.out.println("init testInterfaceName");
        return new TestInterfaceNameImpl();
    }

    private TestInterface buildTestInterfaceImpl(TestInterfaceName testInterfaceName) {
        TestInterfaceImpl testInterface = new TestInterfaceImpl(testInterfaceName);
        testInterface.init();
        return testInterface;
    }

}


public interface TestInterface {

    void test();

}


public class TestInterfaceImpl implements TestInterface{

    private TestInterfaceName testInterfaceName;

    public TestInterfaceImpl(TestInterfaceName testInterfaceName){  -- 构造器注入依赖
        this.testInterfaceName = testInterfaceName;
    }

    @Override
    public void test() {

    }

    public void init(){
        System.out.println("init:"+ testInterfaceName);
    }
}


public interface TestInterfaceName {

    void test();
}


public class TestInterfaceNameImpl implements TestInterfaceName{
    @Override
    public void test() {

    }
}
    @Override
    public void test() {

    }
}

  

  

 

循环依赖

  由于循环依赖,会注入半成品对象,如果在启动时,有大量的初始化逻辑,可能会导致注入的依赖是未完成初始化的Bean;

posted on 2025-02-26 16:54  anpeiyong  阅读(12)  评论(0)    收藏  举报

导航