SpringBoot中創(chuàng)建bean的7種方式總結(jié)
spring.factories
使用 spring.factories是springboot加載bean的一種方式,通常用于自動(dòng)裝配環(huán)境配置相關(guān)的類,和Configuration注解有異曲同工之妙。
其機(jī)制和java的SPI機(jī)制類似,不同的是其配置規(guī)則 : spring.factories以key,value的鍵值對(duì)列表存在。value是類的完全限定類名。類之間用逗號(hào)(,)分隔,后面跟著反斜杠(\)和換行符,以提高可讀性。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.AutoConfigurationClass1,\ com.example.AutoConfigurationClass2
@Configuration + @ComponentScan
@Configuration顧名思義就是我們的環(huán)境配置,標(biāo)記SpringBoot中的配置類。其一般與其他Spring的相關(guān)配置一起使用。內(nèi)部的話就是我們需要注入到spring容器的bean。
- 與@Conditiona簇的注解一起使用,用于在標(biāo)識(shí)該類在滿足某種規(guī)則后下生效。
- 在配置類中我們也可以添加@import注解導(dǎo)入某些類。
- 一般我們的配置類如果在啟動(dòng)類包路徑下的話,SpringBoot可以自行裝配,無(wú)需其他配置去掃描發(fā)現(xiàn)。但是如果不是的話,則需要配置 @ComponentScan或者 spring.factories文件了。一般我們開發(fā)一個(gè)框架的話,推薦使用spring.factories的方式,這樣使用者導(dǎo)入相應(yīng)的jar包(一般是spring-starter包)即可自動(dòng)裝配相應(yīng)的bean。
如下的nacos中的服務(wù)發(fā)現(xiàn)配置:
@Configuration(proxyBeanMethods = false) @ConditionalOnDiscoveryEnabled @ConditionalOnNacosDiscoveryEnabled public class NacosDiscoveryAutoConfiguration { @Bean @ConditionalOnMissingBean public NacosDiscoveryProperties nacosProperties() { return new NacosDiscoveryProperties(); } @Bean @ConditionalOnMissingBean public NacosServiceDiscovery nacosServiceDiscovery( NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) { return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager); } }
@Import直接導(dǎo)入類
在Spring框架中,@Import注解用于導(dǎo)入一個(gè)或多個(gè)配置類或普通的Java類,以便在當(dāng)前的配置類中使用。它可以在@Configuration注解的類中使用,用于引入其他類的定義,以便在當(dāng)前類中使用這些定義。
@Import注解一般有以下兩種使用方式:
- 導(dǎo)入一個(gè)或多個(gè)配置類:可以使用@Import注解導(dǎo)入其他使用了@Configuration注解的配置類。例如,@Import(MyConfig.class)將會(huì)導(dǎo)入名為MyConfig的配置類。
- 導(dǎo)入普通的Java類:可以使用@Import注解導(dǎo)入非配置類的Java類,以便在當(dāng)前配置類中使用該類的實(shí)例。例如,@Import(MyService.class)將會(huì)導(dǎo)入名為MyService的普通Java類。
- Import只能在類上使用。
@Configuration(proxyBeanMethods = false) @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) @EnableConfigurationProperties(RabbitProperties.class) @Import({ RabbitAnnotationDrivenConfiguration.class, RabbitStreamConfiguration.class }) public class RabbitAutoConfiguration { ... }
上述配置示例就又導(dǎo)入了兩個(gè)配置類:RabbitAnnotationDrivenConfiguration,RabbitStreamConfiguration。
@Bean
注解@Bean一般用于向spring中注入一個(gè)比較復(fù)雜的bean,這個(gè)bean一般配置復(fù)雜,功能多。它也是我們使用的最多的一種方式。它有以下幾個(gè)特點(diǎn):
- 可以指定bean的名稱:可以使用name屬性指定bean的名稱。如果未指定名稱,則將使用方法名作為bean的名稱。
- 可以指定bean的作用域:可以使用@Scope注解指定bean的作用域。默認(rèn)情況下,bean的作用域?yàn)閱卫丛谡麄€(gè)應(yīng)用程序上下文中只有一個(gè)實(shí)例)。
- 可以指定bean的初始化和銷毀方法:可以使用@PostConstruct和@PreDestroy注解指定bean的初始化和銷毀方法。
@Configuration public class MyConfiguration { @Bean public User user() { User user = new User(); User.setName("凹凸曼"); return user; } }
@Componet + @ComponentScan
@Componet注解也是我們使用的比較多的注解,可能我這樣說(shuō)你比較疑惑。但是@Controller,@Service,@Repository這些注解你熟悉吧,他們都是基于@Componet實(shí)現(xiàn)的。其和@ComponentScan注解搭配使用,通過掃描某個(gè)包路徑來(lái)實(shí)現(xiàn)導(dǎo)入。
FactoryBean接口
FactoryBean千萬(wàn)不要和BeanFactory搞混了喔。BeanFactory是spring的bean管理工廠用于管理Spring中的bean的,它是IOC容器的頂級(jí)接口,。FactoryBean是用來(lái)創(chuàng)建復(fù)雜的或自定義bean的。
FactoryBean接口有兩個(gè)主要方法:
- T getObject():該方法返回由工廠創(chuàng)建的對(duì)象實(shí)例。
- Class<?> getObjectType():該方法返回由工廠創(chuàng)建的對(duì)象的類型。
我們來(lái)看一個(gè)列子:
@Configuration public class TestConfiguration { @Bean public UserFactoryBean userFactoryBean() { return new UserFactoryBean(); } public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfiguration.class); Person bean = applicationContext.getBean(User.class); System.out.println(bean); } } class UserFactoryBean implements FactoryBean<User> { /** * 直接new出來(lái)User進(jìn)行返回. */ @Override public User getObject() throws Exception { return new User(); } /** * 指定返回bean的類型. */ @Override public Class<?> getObjectType() { return User.class; } }
BeanDefinitionRegistryPostProcessor
這個(gè)提供的一個(gè)擴(kuò)展點(diǎn),BeanDefinitionRegistryPostProcessor接口是spring提供的一個(gè)擴(kuò)展點(diǎn),用于允許開發(fā)者在應(yīng)用程序上下文啟動(dòng)時(shí)動(dòng)態(tài)修改或注冊(cè)bean定義。它允許開發(fā)者在應(yīng)用程序上下文創(chuàng)建bean之前對(duì)bean定義進(jìn)行更改或添加新的bean定義。
class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition(); registry.registerBeanDefinition("user", beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
總結(jié)
上訴我們一共介紹了7種創(chuàng)建bean的方式,希望對(duì)大家有所幫助,以上內(nèi)容就到這里,感謝各位看官老爺們的觀看,如果覺得寫得好,給個(gè)贊支持一下哈?。?!
到此這篇關(guān)于SpringBoot中創(chuàng)建bean的7種方式總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot創(chuàng)建bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot定制三種錯(cuò)誤頁(yè)面及錯(cuò)誤數(shù)據(jù)方法示例
Spring Boot提供的默認(rèn)異常處理機(jī)制通常并不一定適合我們實(shí)際的業(yè)務(wù)場(chǎng)景,因此,我們通常會(huì)根據(jù)自身的需要對(duì)Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯(cuò)誤頁(yè)面,定制錯(cuò)誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯(cuò)誤頁(yè)面的實(shí)現(xiàn),快來(lái)學(xué)習(xí)吧2021-12-12MyBatis編寫一個(gè)簡(jiǎn)單的SQL生成工具
MyBatis 是一個(gè)強(qiáng)大的數(shù)據(jù)持久化框架,它提供了一種半自動(dòng)化的 ORM 實(shí)現(xiàn)方式,本文將為大家介紹如何使用MyBatis編寫一個(gè)簡(jiǎn)單的SQL生成工具,需要的可以了解下2025-03-03一步步教你如何使用Java實(shí)現(xiàn)WebSocket
websocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議,它實(shí)現(xiàn)了瀏覽器與服務(wù)器的全雙工通訊-允許服務(wù)器主動(dòng)發(fā)起信息個(gè)客戶端,websocket是一種持久協(xié)議,http是非持久協(xié)議,下面這篇文章主要給大家介紹了關(guān)于如何使用Java實(shí)現(xiàn)WebSocket的相關(guān)資料,需要的朋友可以參考下2023-05-05SpringBoot Admin使用及心跳檢測(cè)原理分析
這篇文章主要介紹了SpringBoot Admin使用及心跳檢測(cè)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java FileInputStream與FileOutputStream使用詳解
這篇文章主要介紹了Java FileInputStream與FileOutputStream使用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08MySQL 新增字段但 Java 實(shí)體未更新存在潛在問題與解決方案
在 Java + MySQL 的開發(fā)中,我們通常使用 ORM 框架(如 MyBatis、MyBatis-Plus、Hibernate)來(lái)映射數(shù)據(jù)庫(kù)表與 Java 對(duì)象,這篇文章主要介紹了MySQL 新增字段但 Java 實(shí)體未更新:潛在問題與解決方案,需要的朋友可以參考下2025-04-04簡(jiǎn)單了解java類型轉(zhuǎn)換常見的錯(cuò)誤
這篇文章主要介紹了簡(jiǎn)單了解java類型轉(zhuǎn)換常見的錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04