詳談spring中bean注入無(wú)效和new創(chuàng)建對(duì)象的區(qū)別
bean注入無(wú)效和new創(chuàng)建對(duì)象區(qū)別
注意!如果直接new的話,類(lèi)里面的autowire將不生效
項(xiàng)目中用到如下代碼
然后 在運(yùn)行的時(shí)候發(fā)現(xiàn) 通過(guò) @Autowired注入的對(duì)象 capitalDetailDOMapper和 excelRecordDOMapper的值為null
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}剛開(kāi)始以為是ExcelListener沒(méi)有加bean掃描注解導(dǎo)致的
于是加上后
@Component
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}結(jié)果在運(yùn)行的時(shí)候,兩個(gè)mapper,仍然為null。
檢查代碼發(fā)現(xiàn)
在ExcelListener這個(gè)類(lèi)的使用場(chǎng)景中,是 ExcelListener excelListener= new ExcelListener(); 創(chuàng)建的對(duì)象

這里就明白了, 手動(dòng)通過(guò)new創(chuàng)建和通過(guò)spring容器創(chuàng)建管理對(duì)象是不一樣的,手動(dòng)new的對(duì)象,內(nèi)部用@autowire注解是無(wú)效的。
若讓該autowire生效,則需要通過(guò)容器來(lái)管理對(duì)象
改造如下,先給ExcelListener加上注解@Component
@Scope(“prototype”)
@Component(“excelListener”)
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}這樣 這個(gè)bean就會(huì)被加載到spring容器中,這里Scope表示bean的作用范圍,spring默認(rèn)創(chuàng)建的對(duì)象是單例的
prototype是非單例,這里我主要是想在不同的線程里面創(chuàng)建不同的ExcelListener實(shí)例。
可以通過(guò)容器獲取bean,也可以直接@autowire
ExcelListener excelListener= SpringBeanUtils.getBean(“excelListener”);
其中SpringBeanUtils為實(shí)現(xiàn)了BeanFactoryPostProcessor接口的實(shí)現(xiàn)類(lèi)
能夠從spring容器里面獲取到bean的實(shí)例,如果bean是非單例的 每次則獲取到是一個(gè)新的bean
@Component
@Getter
public class SpringBeanUtils implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory;
public static T getBean(String beanName) {
return (T) beanFactory.getBean(beanName);
}
public static T getBean(Class beanClz) {
return beanFactory.getBean(beanClz);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringBeanUtils.beanFactory = beanFactory;
}
}注意?。∪绻鸄類(lèi)是單例的,那么A類(lèi)中的成員B類(lèi)聲明為非單例的,也是無(wú)效的。
因?yàn)橹挥蠥類(lèi)的一個(gè)實(shí)例,里面包含的B類(lèi)的實(shí)例也只有一個(gè)。 除非能再次創(chuàng)建A類(lèi)的實(shí)例,才能創(chuàng)建出另一個(gè)B類(lèi)的實(shí)例對(duì)象。
bean交個(gè)spring和new比較區(qū)別
在spring的配置文件中我們要使用DataSource這個(gè)對(duì)吧
這個(gè)bean將會(huì)被多個(gè)bean引用 通過(guò)ref="dateSource"這個(gè)引用 當(dāng)我們要修改這個(gè)只要修改引用就好了 不需要修改很多了
主要是解耦
比如你有一個(gè)A類(lèi) 在好幾個(gè)類(lèi)里邊要調(diào)用到A的方法 new的話就要在每個(gè)類(lèi)里都new A()
spring的話 只要配置一個(gè)bean進(jìn)行注入就夠了。
哪天你不用A類(lèi)了 改成B了~ 直接把bean里邊的class改成B就搞定了
如果用new的話 要改好幾個(gè)地方~
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描
- spring?Bean創(chuàng)建的完整過(guò)程記錄
- JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式
- Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案
- Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例
- Spring容器的創(chuàng)建過(guò)程之如何注冊(cè)BeanPostProcessor詳解
- Spring?Bean創(chuàng)建的另一條捷徑
相關(guān)文章
Java使用Swing實(shí)現(xiàn)一個(gè)模擬電腦計(jì)算器
Java Swing 是一個(gè)用于創(chuàng)建 Java GUI(圖形用戶(hù)界面)的框架,它提供了一系列的 GUI 組件和工具,可以用于創(chuàng)建桌面應(yīng)用程序,包括按鈕、文本框、標(biāo)簽、表格等等,本文給大家介紹了Java使用Swing實(shí)現(xiàn)一個(gè)模擬計(jì)算器,感興趣的同學(xué)可以自己動(dòng)手嘗試一下2024-05-05
教你創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù)的超詳細(xì)過(guò)程
這篇文章主要介紹了創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù),主要是創(chuàng)建兩個(gè)springboot服務(wù),在教程中增加springcloud相關(guān)組件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Springboot jpa @Column命名大小寫(xiě)問(wèn)題及解決
這篇文章主要介紹了Springboot jpa @Column命名大小寫(xiě)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
基于java實(shí)現(xiàn)簡(jiǎn)單的圖片類(lèi)別識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何基于java實(shí)現(xiàn)簡(jiǎn)單的圖片類(lèi)別識(shí)別功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了Java swing實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計(jì)算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下2017-12-12
Java?Spring?boot?配置JDK和MAVEN開(kāi)發(fā)環(huán)境的過(guò)程
本文詳細(xì)介紹了如何配置JDK和Maven環(huán)境,包括JDK的安裝與環(huán)境變量設(shè)置,Maven的下載、配置環(huán)境變量和設(shè)置阿里云倉(cāng)庫(kù),最后簡(jiǎn)述了在IntelliJ?IDEA中配置JDK和Maven的步驟,本教程適合Java開(kāi)發(fā)新手進(jìn)行開(kāi)發(fā)環(huán)境的搭建,確保順利進(jìn)行Java項(xiàng)目的開(kāi)發(fā)2024-11-11
SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析
這篇文章主要介紹了SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析,如果一個(gè)配置類(lèi)只配置@ConfigurationProperties注解,而沒(méi)有使用@Component或者實(shí)現(xiàn)了@Component的其他注解,那么在IOC容器中是獲取不到properties 配置文件轉(zhuǎn)化的bean,需要的朋友可以參考下2024-01-01
五分鐘帶你了解Java的接口數(shù)據(jù)校驗(yàn)
這篇文章主要介紹了五分鐘帶你了解Java的接口數(shù)據(jù)校驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

