Spring Boot中單例類(lèi)實(shí)現(xiàn)對(duì)象的注入方式
項(xiàng)目用的是SpringBoot,但其中有個(gè)類(lèi)用的是單例,為了不改變單例,且還需要引入Spring管理的Bean對(duì)象
2、對(duì)于一個(gè)單例類(lèi)按照平時(shí)的注解方式添加啟動(dòng)時(shí)會(huì)報(bào)空指針異常,因?yàn)閟tatic類(lèi)對(duì)象是創(chuàng)建對(duì)象后,內(nèi)存中還沒(méi)有注入Bean信息,且無(wú)法初始化Bean實(shí)例,這里的解決辦法是利用@PostConstruct來(lái)對(duì)單例類(lèi)中對(duì)象的注入
@Componentpublic 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的對(duì)象注入1、需求
現(xiàn)在我們的項(xiàng)目中需要引入一個(gè)java類(lèi)庫(kù),我想要很方便的使用該類(lèi)庫(kù)中的一個(gè)類(lèi),并且我想要?jiǎng)?chuàng)建這個(gè)類(lèi)的一個(gè)單例對(duì)象。然后可以很方便的在各個(gè)模塊中用@AutoWired進(jìn)行對(duì)象注入。
比如一個(gè)配置文件,我在一個(gè)地方創(chuàng)建Configuration對(duì)象,讀取配置文件中的配置,然后在各個(gè)模塊中使用該對(duì)象。
2、需求分析這個(gè)需求涉及到兩個(gè)問(wèn)題
一個(gè)是單例對(duì)象的創(chuàng)建;另外一個(gè)是單例對(duì)象的引用。因?yàn)椋阋靡粋€(gè)對(duì)象,你首先得創(chuàng)建它。創(chuàng)建一個(gè)對(duì)象在Spring中有固定的模式,在定義類(lèi)的時(shí)候使用@Component注解,@Component默認(rèn)是單例的。這樣spring framework在進(jìn)行component scan的時(shí)候就會(huì)創(chuàng)建這個(gè)對(duì)象。用的時(shí)候很簡(jiǎn)單,只需要@Autowired就可以了。
@Autowired最好使用構(gòu)造器注入,也就是說(shuō),不是直接將@Autowired放在成員變量上面,而是放在構(gòu)建函數(shù)上面,然后通過(guò)構(gòu)造函數(shù)的參數(shù)注入。為何要這么麻煩?
3、Spring boot是對(duì)spring使用的簡(jiǎn)化所以這整個(gè)的過(guò)程也是Spring boot所具備的能力。
4、以上分析的是自己創(chuàng)建的類(lèi)對(duì)象注入現(xiàn)在如果用這種對(duì)象注入來(lái)使用成熟的包中的對(duì)象呢?
4.1 使用配置文件生成bean
<bean class='xxx'></bean>
4.2 使用@Configuration注解生成bean
@Configurationpublic 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)類(lèi)處用@Service
6 關(guān)于@Autowired要用到另外一個(gè)類(lèi)的對(duì)象時(shí),首先定義一個(gè)引用。
然后在本類(lèi)的構(gòu)造函數(shù)中給該引用賦值,然后將@Autowired來(lái)注解這個(gè)構(gòu)造函數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)2. XMLDOM對(duì)象方法:對(duì)象屬性3. 使用IDEA編寫(xiě)jsp時(shí)EL表達(dá)式不起作用的問(wèn)題及解決方法4. jsp實(shí)現(xiàn)textarea中的文字保存換行空格存到數(shù)據(jù)庫(kù)的方法5. ASP.NET Identity的基本用法6. 解決ajax的delete、put方法接收不到參數(shù)的問(wèn)題方法7. 原生Ajax之全面了解xhr的概念與使用8. Spring boot使用logback實(shí)現(xiàn)日志管理過(guò)程詳解9. Python Django搭建網(wǎng)站流程圖解10. IDEA創(chuàng)建Java項(xiàng)目導(dǎo)出Jar包運(yùn)行
