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

這里就明白了, 手動通過new創(chuàng)建和通過spring容器創(chuàng)建管理對象是不一樣的,手動new的對象,內(nèi)部用@autowire注解是無效的。
若讓該autowire生效,則需要通過容器來管理對象
改造如下,先給ExcelListener加上注解@Component
@Scope(“prototype”)
@Component(“excelListener”)
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}這樣 這個bean就會被加載到spring容器中,這里Scope表示bean的作用范圍,spring默認(rèn)創(chuàng)建的對象是單例的
prototype是非單例,這里我主要是想在不同的線程里面創(chuàng)建不同的ExcelListener實例。
可以通過容器獲取bean,也可以直接@autowire
ExcelListener excelListener= SpringBeanUtils.getBean(“excelListener”);
其中SpringBeanUtils為實現(xiàn)了BeanFactoryPostProcessor接口的實現(xiàn)類
能夠從spring容器里面獲取到bean的實例,如果bean是非單例的 每次則獲取到是一個新的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;
}
}注意??!如果A類是單例的,那么A類中的成員B類聲明為非單例的,也是無效的。
因為只有A類的一個實例,里面包含的B類的實例也只有一個。 除非能再次創(chuàng)建A類的實例,才能創(chuàng)建出另一個B類的實例對象。
bean交個spring和new比較區(qū)別
在spring的配置文件中我們要使用DataSource這個對吧
這個bean將會被多個bean引用 通過ref="dateSource"這個引用 當(dāng)我們要修改這個只要修改引用就好了 不需要修改很多了
主要是解耦
比如你有一個A類 在好幾個類里邊要調(diào)用到A的方法 new的話就要在每個類里都new A()
spring的話 只要配置一個bean進行注入就夠了。
哪天你不用A類了 改成B了~ 直接把bean里邊的class改成B就搞定了
如果用new的話 要改好幾個地方~
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
教你創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù)的超詳細過程
這篇文章主要介紹了創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù),主要是創(chuàng)建兩個springboot服務(wù),在教程中增加springcloud相關(guān)組件,本文分步驟給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04
Springboot jpa @Column命名大小寫問題及解決
這篇文章主要介紹了Springboot jpa @Column命名大小寫問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java?Spring?boot?配置JDK和MAVEN開發(fā)環(huán)境的過程
本文詳細介紹了如何配置JDK和Maven環(huán)境,包括JDK的安裝與環(huán)境變量設(shè)置,Maven的下載、配置環(huán)境變量和設(shè)置阿里云倉庫,最后簡述了在IntelliJ?IDEA中配置JDK和Maven的步驟,本教程適合Java開發(fā)新手進行開發(fā)環(huán)境的搭建,確保順利進行Java項目的開發(fā)2024-11-11
SpringBoot中的@EnableConfigurationProperties注解詳細解析
這篇文章主要介紹了SpringBoot中的@EnableConfigurationProperties注解詳細解析,如果一個配置類只配置@ConfigurationProperties注解,而沒有使用@Component或者實現(xiàn)了@Component的其他注解,那么在IOC容器中是獲取不到properties 配置文件轉(zhuǎn)化的bean,需要的朋友可以參考下2024-01-01

