Spring Boot中單例類實(shí)現(xiàn)對象的注入方式
Spring Boot 單例類實(shí)現(xiàn)對象的注入
1、最近接手了一個(gè)項(xiàng)目
項(xiàng)目用的是SpringBoot,但其中有個(gè)類用的是單例,為了不改變單例,且還需要引入Spring管理的Bean對象
2、對于一個(gè)單例類按照平時(shí)的注解方式添加
啟動(dòng)時(shí)會報(bào)空指針異常,因?yàn)閟tatic類對象是創(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)在我們的項(xiàng)目中需要引入一個(gè)java類庫,我想要很方便的使用該類庫中的一個(gè)類,并且我想要?jiǎng)?chuàng)建這個(gè)類的一個(gè)單例對象。然后可以很方便的在各個(gè)模塊中用@AutoWired進(jìn)行對象注入。
比如一個(gè)配置文件,我在一個(gè)地方創(chuàng)建Configuration對象,讀取配置文件中的配置,然后在各個(gè)模塊中使用該對象。
2、需求分析
這個(gè)需求涉及到兩個(gè)問題
一個(gè)是單例對象的創(chuàng)建;另外一個(gè)是單例對象的引用。因?yàn)椋阋靡粋€(gè)對象,你首先得創(chuàng)建它。創(chuàng)建一個(gè)對象在Spring中有固定的模式,在定義類的時(shí)候使用@Component注解,@Component默認(rèn)是單例的。這樣spring framework在進(jìn)行component scan的時(shí)候就會創(chuàng)建這個(gè)對象。用的時(shí)候很簡單,只需要@Autowired就可以了。
@Autowired最好使用構(gòu)造器注入,也就是說,不是直接將@Autowired放在成員變量上面,而是放在構(gòu)建函數(shù)上面,然后通過構(gòu)造函數(shù)的參數(shù)注入。為何要這么麻煩?
3、Spring boot是對spring使用的簡化
所以這整個(gè)的過程也是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 各個(gè)常用的注解
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è)類的對象時(shí),首先定義一個(gè)引用。
然后在本類的構(gòu)造函數(shù)中給該引用賦值,然后將@Autowired來注解這個(gè)構(gòu)造函數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue+springboot讀取git的markdown文件并展示功能
Markdown-it 是一個(gè)用于解析和渲染 Markdown 標(biāo)記語言的 JavaScript 庫,使用 Markdown-it,你可以將 Markdown 文本解析為 HTML 輸出,并且可以根據(jù)需要添加功能、擴(kuò)展語法或修改解析行為,本文介紹vue+springboot讀取git的markdown文件并展示,感興趣的朋友一起看看吧2024-01-01springBoot整合jwt實(shí)現(xiàn)token令牌認(rèn)證的示例代碼
實(shí)施Token驗(yàn)證的方法挺多的,還有一些標(biāo)準(zhǔn)方法,比如JWT,本文主要介紹了springBoot整合jwt實(shí)現(xiàn)token令牌認(rèn)證的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開發(fā)工作中,我們時(shí)常會遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺的銷售報(bào)表等等,需要的朋友可以參考下2023-08-08