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;
浙公网安备 33010602011771号