Spring Boot中單例類實現對象的註入方式
Spring Boot 單例類實現對象的註入
1、最近接手瞭一個項目
項目用的是SpringBoot,但其中有個類用的是單例,為瞭不改變單例,且還需要引入Spring管理的Bean對象
2、對於一個單例類按照平時的註解方式添加
啟動時會報空指針異常,因為static類對象是創建對象後,內存中還沒有註入Bean信息,且無法初始化Bean實例,這裡的解決辦法是利用@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、需求
現在我們的項目中需要引入一個java類庫,我想要很方便的使用該類庫中的一個類,並且我想要創建這個類的一個單例對象。然後可以很方便的在各個模塊中用@AutoWired進行對象註入。
比如一個配置文件,我在一個地方創建Configuration對象,讀取配置文件中的配置,然後在各個模塊中使用該對象。
2、需求分析
這個需求涉及到兩個問題
一個是單例對象的創建;另外一個是單例對象的引用。因為,你要用一個對象,你首先得創建它。創建一個對象在Spring中有固定的模式,在定義類的時候使用@Component註解,@Component默認是單例的。這樣spring framework在進行component scan的時候就會創建這個對象。用的時候很簡單,隻需要@Autowired就可以瞭。
@Autowired最好使用構造器註入,也就是說,不是直接將@Autowired放在成員變量上面,而是放在構建函數上面,然後通過構造函數的參數註入。為何要這麼麻煩?
3、Spring boot是對spring使用的簡化
所以這整個的過程也是Spring boot所具備的能力。
4、以上分析的是自己創建的類對象註入
現在如果用這種對象註入來使用成熟的包中的對象呢?
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接口處不用,在接口的實現類處用@Service
6 關於@Autowired
要用到另外一個類的對象時,首先定義一個引用。
然後在本類的構造函數中給該引用賦值,然後將@Autowired來註解這個構造函數。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring boot 無法註入service問題
- 解決springboot遇到autowire註入為null的問題
- Spring使用@Autowired註解靜態實例對象方式
- 使用Spring啟動時運行自定義業務
- 淺談SpringBoot中的Bean初始化方法 @PostConstruct