聊一聊new对象与Spring对bean的初始化的差别

网友投稿 299 2022-08-25


聊一聊new对象与Spring对bean的初始化的差别

目录new对象与Spring对bean初始化差别什么意思呢?简单来理解Spring类的注入和new简单理解springbootspring的单例是针对自动注入

new对象与Spring对bean初始化差别

这个问题是一次我将老系统代码迁移到基于SprlYKCJDing构建的新系统中时遇到的,老代码中有很多地方使用了new方法来初始化对象,当时也没有特别注意,最后联调的时候发现所有new出来的对象中使用Autowired自动依赖注入的属性全都抛出了NullPointerException。

什么意http://思呢?

@Component

Class A {

...

}

@Component

Class B {

...

}

@Component

Class C {

@Autowired

A a;

@Autowired

B b;

}

当我使用C c = new C()时,c中的a和b都是null,也就是无法完成注入。

说实话,在联调的那一刻我有一瞬间是懵逼的,但现在回想起来,哦,真是太傻了。

简单来理解

Spring首先会通过new方法创建一个对象,然后去完成属性的填充,而这种填充在我们外界看来是“自动”的;而我们直接通过new方法创建对象时,是没有谁去完成属性的填充的,因而内部属性值全为null。

Spring类的注入和new简单理解

springboot

main.run方法进入refreshContextrefreshfinishBeanFactoryInitialization(完成bealYKCJDnFactory的初始化)preInstantiateSingletons(初始化单例)getBean(获取Bean)doGetBeancreateBeandoCreateBean(此方法内部会createBean,创建bean即构造方法执行)populateBean(进行autowired自动注入)applyPropertyValues(进行属性注入)

PS:new对象,不能导致对象依赖的注入属性自动赋值,只有对对象进行注入,对象依赖的注入属性才能赋值;

且注入的属性不能在构造函数中操作,因为bean没有创建完成,属性也没有注入,此时是为null的

问题:spring默认是单例模式,还有必要创建单例类吗?

自己理解:有必要,如果不使用autowired进行自动注入,使用new操作还是可以生成多个对象,

spring的单例是针对自动注入

例子:

@Component

public class CxfClient{undefined

@Value("${address }")

private String address;

private CxfClient(){undefined

System.out.println(address ); //此时为null.bean没有加载完成,属性也没有加载

}

public void createClient(){undefined

System.out.println(address );//此时为配置文件中的值

}

private static class SingletonHolder {undefined

private static final CxfClient INSTANCE = new CxfClient();

}

public static final CxfClient getInstance() {undefined

return SingletonHolder.INSTANCE;

}

}

public class Test{undefined

@Autowired

private CxfClient cxfClient;

public void testClient(){undefined

CxfClient.getInstance().createClient();//打印为null.无法注入

cxfClient.createClient();//打印为配置文件中的值

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python 扩展print打印文件路径和当前时间信息(python代码大全)
下一篇:python z3库学习(python基础教程)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~