最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中創(chuàng)建bean的7種方式總結(jié)

 更新時(shí)間:2023年07月12日 11:20:00   作者:Aqoo  
Spring是一款廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用程序開發(fā)的Java框架,其 IOC 和 DI 特性可以有效地管理應(yīng)用程序中的對(duì)象,提高了應(yīng)用程序的可維護(hù)性和可擴(kuò)展性,那你知道spring有哪些方式將bean放入容器嘛,今天就給大家總結(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注解搭配使用,通過(guò)掃描某個(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)文章

  • 使用Fastjson進(jìn)行JSON生成與解析的新手指南

    使用Fastjson進(jìn)行JSON生成與解析的新手指南

    Fastjson是阿里巴巴開源的高性能 JSON 庫(kù),適用于 Java 對(duì)象的序列化和反序列化,本文將詳細(xì)介紹一下如何使用Fastjson進(jìn)行json的生成與解析吧
    2025-04-04
  • Java中Double除保留后小數(shù)位的幾種方法(小結(jié))

    Java中Double除保留后小數(shù)位的幾種方法(小結(jié))

    這篇文章主要介紹了Java中Double保留后小數(shù)位的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • SpringBoot如何讀取配置文件參數(shù)并全局使用

    SpringBoot如何讀取配置文件參數(shù)并全局使用

    這篇文章主要介紹了SpringBoot如何讀取配置文件參數(shù)并全局使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于Spring組成的七大模塊詳解

    關(guān)于Spring組成的七大模塊詳解

    Spring是一個(gè)開源的應(yīng)用框架,用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用開發(fā),它由核心容器、應(yīng)用上下文、面向切面編程、JDBC和DAO模塊、對(duì)象實(shí)體映射、Web模塊和MVC模塊七大模塊組成,這些模塊提供了各種功能,如依賴注入、面向切面編程、ORM支持、Web開發(fā)等,以幫助開發(fā)者更高效地開發(fā)應(yīng)用
    2025-11-11
  • Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java中使用Jedis操作Redis的示例代碼

    Java中使用Jedis操作Redis的示例代碼

    本篇文章主要介紹了Java中使用Jedis操作Redis的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法

    IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法

    這篇文章主要介紹了IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • IDEA如何實(shí)現(xiàn)查看UML類圖

    IDEA如何實(shí)現(xiàn)查看UML類圖

    這篇文章主要介紹了IDEA如何實(shí)現(xiàn)查看UML類圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java面試題沖刺第三天--集合框架篇

    Java面試題沖刺第三天--集合框架篇

    這篇文章主要為大家分享了最有價(jià)值的三道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • ArrayList和HashMap如何自己實(shí)現(xiàn)實(shí)例詳解

    ArrayList和HashMap如何自己實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了 ArrayList和HashMap如何自己實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評(píng)論

简阳市| 乌鲁木齐县| 宁化县| 宣化县| 铜鼓县| 沧州市| 中方县| 神木县| 高平市| 永新县| 乌拉特后旗| 满洲里市| 云和县| 南京市| 龙游县| 乌兰浩特市| 武平县| 哈密市| 泰和县| 绥芬河市| 尉犁县| 麟游县| 丹棱县| 芜湖市| 贺兰县| 高陵县| 上蔡县| 铜陵市| 东方市| 巴青县| 赣榆县| 高州市| 英超| 乐陵市| 长阳| 临洮县| 神木县| 武强县| 临朐县| 原平市| 镇平县|