Spring Boot中單例類實(shí)現(xiàn)對象的注入方式
Spring Boot 單例類實(shí)現(xiàn)對象的注入
1、最近接手了一個項目
項目用的是SpringBoot,但其中有個類用的是單例,為了不改變單例,且還需要引入Spring管理的Bean對象
2、對于一個單例類按照平時的注解方式添加
啟動時會報空指針異常,因為static類對象是創(chuàng)建對象后,內(nèi)存中還沒有注入Bean信息,且無法初始化Bean實(shí)例,這里的解決辦法是利用@PostConstruct來對單例類中對象的注入
@Component
public class MesssageHandle implements IMessageHandler {
private final static Logger logger = LoggerFactory.getLogger(MesssageHandle.class);
private static MesssageHandle instance = new MesssageHandle();
@Autowired
private ScheduleService scheduleService;
private MesssageHandle(){ }
public static MesssageHandle getInstance() {
return instance;
}
@PostConstruct
public void init(){
instance = this;
instance.scheduleService = this.scheduleService;
}
spring boot的對象注入
1、需求
現(xiàn)在我們的項目中需要引入一個java類庫,我想要很方便的使用該類庫中的一個類,并且我想要創(chuàng)建這個類的一個單例對象。然后可以很方便的在各個模塊中用@AutoWired進(jìn)行對象注入。
比如一個配置文件,我在一個地方創(chuàng)建Configuration對象,讀取配置文件中的配置,然后在各個模塊中使用該對象。
2、需求分析
這個需求涉及到兩個問題
一個是單例對象的創(chuàng)建;另外一個是單例對象的引用。因為,你要用一個對象,你首先得創(chuàng)建它。創(chuàng)建一個對象在Spring中有固定的模式,在定義類的時候使用@Component注解,@Component默認(rèn)是單例的。這樣spring framework在進(jìn)行component scan的時候就會創(chuàng)建這個對象。用的時候很簡單,只需要@Autowired就可以了。
@Autowired最好使用構(gòu)造器注入,也就是說,不是直接將@Autowired放在成員變量上面,而是放在構(gòu)建函數(shù)上面,然后通過構(gòu)造函數(shù)的參數(shù)注入。為何要這么麻煩?
3、Spring boot是對spring使用的簡化
所以這整個的過程也是Spring boot所具備的能力。
4、以上分析的是自己創(chuàng)建的類對象注入
現(xiàn)在如果用這種對象注入來使用成熟的包中的對象呢?
4.1 使用配置文件生成bean
<bean class="xxx"></bean>
4.2 使用@Configuration注解生成bean
@Configuration
public class AppConfig {
@Bean(name = "timedCache")
public TimedCache<String, Muser> listStrBean() {
return new TimedCache<String, Muser>(30 * 6000);
}
}
5 各個常用的注解
5.1 dao
@Repository
5.2 model
不需要注解
5.3 restful的controller
@RestController
5.4 service
service接口處不用,在接口的實(shí)現(xiàn)類處用@Service
6 關(guān)于@Autowired
要用到另外一個類的對象時,首先定義一個引用。
然后在本類的構(gòu)造函數(shù)中給該引用賦值,然后將@Autowired來注解這個構(gòu)造函數(shù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot 自動更新靜態(tài)文件和后臺代碼的實(shí)例
下面小編就為大家分享一篇spring boot 自動更新靜態(tài)文件和后臺代碼的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
java根據(jù)負(fù)載自動抓取jstack?dump詳情
這篇文章主要介紹了java根據(jù)負(fù)載自動抓取jstack?dump詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
Java Date類常用示例_動力節(jié)點(diǎn)Java學(xué)院整理
在JDK1.0中,Date類是唯一的一個代表時間的類,但是由于Date類不便于實(shí)現(xiàn)國際化,所以從JDK1.1版本開始,推薦使用Calendar類進(jìn)行時間和日期處理。這里簡單介紹一下Date類的使用,需要的朋友可以參考下2017-05-05
spring結(jié)合redis如何實(shí)現(xiàn)數(shù)據(jù)的緩存
這篇文章主要介紹了spring結(jié)合redis如何實(shí)現(xiàn)數(shù)據(jù)的緩存,實(shí)現(xiàn)的目的目的不是加快查詢的速度,而是減少數(shù)據(jù)庫的負(fù)擔(dān),需要的朋友可以參考下2015-12-12
Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧2016-09-09
java9的JShell小工具和編譯器兩種自動優(yōu)化方法
這篇文章主要介紹了java9的JShell小工具和編譯器兩種自動優(yōu)化方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
Java 異步編程實(shí)踐_動力節(jié)點(diǎn)Java學(xué)院整理
異步編程提供了一個非阻塞的,事件驅(qū)動的編程模型。下面通過本文給大家介紹Java 異步編程實(shí)踐,感興趣的的朋友一起看看吧2017-05-05
spring Data jpa簡介_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了spring Data jpa簡介的相關(guān)資料,需要的朋友可以參考下2017-09-09
springboot實(shí)現(xiàn)多實(shí)例crontab搶占定時任務(wù)(實(shí)例代碼)
這篇文章主要介紹了springboot實(shí)現(xiàn)多實(shí)例crontab搶占定時任務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01

