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

Spring?Bean的8種加載方式總結(jié)

 更新時(shí)間:2022年10月26日 15:05:23   作者:阿桿  
以前學(xué)習(xí)Spring框架的時(shí)候,總結(jié)了幾種Bean的加載方式,不過(guò)老師說(shuō)還有其它的加載方式,以下八種并不是全部,但也足以用來(lái)做很多事情了,希望對(duì)大家有所幫助

前言

以前學(xué)習(xí)Spring框架的時(shí)候,總結(jié)了幾種Bean的加載方式,不過(guò)老師說(shuō)還有其它的加載方式,以下八種并不是全部,但也足以用來(lái)做很多事情了。

注意以下是Spring中Bean的加載方式,不是SpringBoot,但其中的很多東西是相通的,尤其是Bean的注入方式、適用場(chǎng)景等,在本文中也有介紹的。

分享給大家一起學(xué)習(xí),如有錯(cuò)誤的地方,麻煩各位在評(píng)論區(qū)幫我指出。

1.xml+<bean>

被配置的bean需要有無(wú)參數(shù)的構(gòu)造函數(shù)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- xml方式聲明自己開(kāi)發(fā)的bean -->
	<bean id="user" class="cn.sticki.blog.pojo.domain.User" />
	<!-- xml方式聲明第三方bean -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

2.xml:context+注解(@Component+4個(gè)@Bean)

使用組件掃描,指定加載bean的位置,spring會(huì)自動(dòng)掃描這個(gè)包下的文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
    ">

    <!-- 組件掃描,指定加載bean的位置 -->
    <context:component-scan base-package="cn.sticki.bean,cn.sticki.config"/>
</beans>

然后在需要被加載的類名上添加@Component注解。也可以使用@Controller、@Service、@Repository定義bean。

@Service
publice class UserServiceImpl implements UserService {
}

使用@Bean定義第三方bean,并將所在類定位為配置類或Bean

@Configuration  // 或使用@Component
public class DBConfig {
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    } 
}

3.配置類+掃描+注解(@Component+4個(gè)@Bean)

使用 AnnotationConfigApplicationContext(SpringConfig.class); 來(lái)獲取 ApplicationContext

public class AppObject {
    public static void main() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        SpringConfig config = ctx.getBean("Config", SpringConfig.class);
        // 兩次獲取的是同一個(gè)對(duì)象
        config.user();
        config.user();
    }
}

和上面的第二種有點(diǎn)類似,就是包的掃描方式有所改變。

@ComponentScan({"cn.sticki.bean","cn.sticki.config"})
public class SpringConfig {
    @Bean
    public DogFactoryBean dog(){
        return new DogFactoryBean();
    }
}

3.1FactoryBean接口

初始化實(shí)現(xiàn)FactoryBean接口的類,實(shí)現(xiàn)對(duì)bean加載到容器之前的批處理操作。

public class DogFactoryBean implements FactoryBean<Dog> {
    @Override
    public Dog getObject() throws Exception {
        return new Dog();
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
}

在下面的bean中,顯示的表示為配置DogFactoryBean ,但實(shí)際上配置的是 Dog 。

@Component
public class SpringConfig {
    @Bean
    public DogFactoryBean dog(){
        return new DogFactoryBean();
    }
}

3.2@ImportResource注解

用于加載配置類并加載配置文件(系統(tǒng)遷移)

@Configuration
@ComponentScan("cn.sticki.bean")
@ImportResource("applicationContext.xml")
public class SpringConfig {
}

3.3proxyBeanMethods屬性

使用 proxyBeanMethods = true 可以保障調(diào)用此類中的方法得到的對(duì)象是從容器中獲取的,而不是重新創(chuàng)建的,但要求必須是通過(guò)此類調(diào)用方法獲得的bean。

@Configuration(proxyBeanMethods = true)
public class SpringConfig {
    @Bean
    public User user() {
        System.out.println("user init...");
        return new User();
    }
}

4.@Import導(dǎo)入bean的類

使用@Import注解導(dǎo)入要注入的bean對(duì)應(yīng)的字節(jié)碼

@Import(User.class)
public class SpringConfig {
}

而被導(dǎo)入的bean無(wú)需使用注解聲明為bean

public class User{
}

這種形式可以有效的降低源代碼與spring技術(shù)的耦合度(無(wú)侵入),在spring技術(shù)底層及諸多框架的整合中大量使用。

使用這種方法可以加在配置類,且也可以加在配置類當(dāng)中的bean。

5.AnnotationConfigApplicationContext調(diào)用register方法

在容器初始化完畢后使用容器對(duì)象手動(dòng)注入bean

public class App {
    public static void main() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        ctx.register(User.class);
        // 打印容器中當(dāng)前的所有bean
        String[] names = ctx.getBeanDefinitionNames();
        for (String name: names) {
            System.out.println(name);
        }
    }
}

必須在容器初始化之后才能使用這種方法。如果重復(fù)加載同一個(gè)bean,后面加載的會(huì)覆蓋前面加載的。

6.@Import導(dǎo)入ImportSelector接口

導(dǎo)入實(shí)現(xiàn)了ImportSelector接口的類,實(shí)現(xiàn)對(duì)導(dǎo)入源的編程式處理

public class MyImportSelector implements ImportSelector {
    public String selectImports(AnnotationMetadata metadata) {
        // 使用metadata可以獲取到導(dǎo)入該類的元類的大量屬性,通過(guò)對(duì)這些屬性進(jìn)行判斷,可以達(dá)到動(dòng)態(tài)注入bean的效果
        boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Import");
        if(flag) {
            return new String[]{"cn.sticki.pojo.User"};
        }
        return new String[]{"cn.sticki.pojo.Dog"};
    }
}

調(diào)用處:

@Import(MyImportSelector.class)
public class SpringConfig {
}

7.@Import導(dǎo)入ImportBeanDefinitionRegistrar接口

導(dǎo)入實(shí)現(xiàn)了ImportBeanDefinitionRegistrar接口的類,通過(guò)BeanDefinition的注冊(cè)器注冊(cè)實(shí)名bean,實(shí)現(xiàn)對(duì)容器中bean的綁定,例如對(duì)現(xiàn)有bean的覆蓋,進(jìn)而達(dá)成不修改源代碼的情況下更換實(shí)現(xiàn)的效果。

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    public String registrarBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        // 使用元數(shù)據(jù)去做判定,然后再?zèng)Q定要注入哪些bean
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user",beanDefinition);
    }
}

調(diào)用處和上面第六種方式差不多。

8.@Import導(dǎo)入BeanDefinitionRegistryPostProcessor接口

導(dǎo)入實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類,通過(guò)BeanDefinition的注冊(cè)器注冊(cè)實(shí)名bean,實(shí)現(xiàn)對(duì)容器中bean的最終裁定。其在@Import中的加載順序?yàn)樽詈笠粋€(gè)加載,可以用來(lái)做bean覆蓋的最終裁定。

public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 注意這里注冊(cè)的是BookServiceImpl4
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl4.class).getBeanDefinition();
        registry.registerBeanDefinition("bookService",beanDefinition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

調(diào)用處:

// 按照先后順序加載,但 MyPostProcessor.class 最后才加載
@Import(BookServiceImpl1.class,MyPostProcessor.class, BookServiceImpl.class, MyImportSelector.class)
public class SpringConfig {
}

后記

這八種加載方式幾乎可以滿足我們所需要的全部場(chǎng)景了,但一般場(chǎng)景下,我們用的其實(shí)也就只有那兩三種,真正掌握這八種加載方式的朋友,肯定是大佬了。

到此這篇關(guān)于Spring Bean的8種加載方式總結(jié)的文章就介紹到這了,更多相關(guān)Spring Bean加載方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    下面小編就為大家分享一篇基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究

    ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究

    ThreadLocal是JDK提供的線程本地變量機(jī)制,但若使用不當(dāng)可能導(dǎo)致內(nèi)存泄漏。正確的使用方式是在使用完后及時(shí)remove,或者使用弱引用等手段避免強(qiáng)引用導(dǎo)致的內(nèi)存泄漏。在多線程編程中,合理使用ThreadLocal可以提高并發(fā)性能,但也需要注意其潛在的內(nèi)存泄漏問(wèn)題
    2023-04-04
  • SpringBoot啟動(dòng)后自動(dòng)執(zhí)行初始化任務(wù)的五種方法

    SpringBoot啟動(dòng)后自動(dòng)執(zhí)行初始化任務(wù)的五種方法

    在 Spring Boot 開(kāi)發(fā)中,我們經(jīng)常需要在應(yīng)用啟動(dòng)后立即執(zhí)行初始化任務(wù),本文將深度解析 ??5 種主流實(shí)現(xiàn)方案??,大家可以根據(jù)自己的需求自行選擇
    2025-04-04
  • ResponseBodyAdvice的使用原理源碼解析

    ResponseBodyAdvice的使用原理源碼解析

    這篇文章主要為大家介紹了ResponseBodyAdvice的使用原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 使用Java根據(jù)文件路徑下載zip文件到本地代碼示例

    使用Java根據(jù)文件路徑下載zip文件到本地代碼示例

    在開(kāi)發(fā)過(guò)程中我們會(huì)遇到需要對(duì)文件進(jìn)行壓縮并下載的功能需求,這篇文章主要給大家介紹了關(guān)于如何使用Java根據(jù)文件路徑下載zip文件到本地的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • MyBatis-Plus?條件查詢器的實(shí)現(xiàn)

    MyBatis-Plus?條件查詢器的實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus?條件查詢器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 使用mybatis攔截器處理敏感字段

    使用mybatis攔截器處理敏感字段

    這篇文章主要介紹了mybatis攔截器處理敏感字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java代碼中4種字符串拼接方式分析

    Java代碼中4種字符串拼接方式分析

    本文主要介紹了Java代碼中4種字符串拼接方式分析,主要介紹了“+”號(hào)、StringBuilder、StringJoiner、String#join,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 如何在32位Windows系統(tǒng)下安裝Java

    如何在32位Windows系統(tǒng)下安裝Java

    這篇文章主要介紹了如何在32位Windows系統(tǒng)下安裝Java,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • springboot本地調(diào)試沒(méi)問(wèn)題,打包運(yùn)行報(bào)錯(cuò)原因及分析

    springboot本地調(diào)試沒(méi)問(wèn)題,打包運(yùn)行報(bào)錯(cuò)原因及分析

    這篇文章主要介紹了springboot本地調(diào)試沒(méi)問(wèn)題,打包運(yùn)行報(bào)錯(cuò)原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評(píng)論

屏东县| 天峻县| 高尔夫| 黄梅县| 镇雄县| 酒泉市| 禄丰县| 昌乐县| 高密市| 黑龙江省| 镇江市| 东光县| 拉萨市| 临清市| 左云县| 和田县| 鄢陵县| 巴彦县| 丁青县| 宁德市| 乌拉特后旗| 高碑店市| 军事| 华蓥市| 安平县| 云阳县| 乌鲁木齐县| 吉水县| 吴旗县| 娄烦县| 乾安县| 什邡市| 阿克苏市| 襄城县| 赤水市| 台中县| 哈尔滨市| 兴海县| 西贡区| 星座| 威宁|