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

SpringBoot bean的多種加載方式示例詳解

 更新時(shí)間:2024年10月10日 12:03:22   作者:冬天vs不冷  
本文詳細(xì)介紹了在SpringBoot中加載Bean的多種方式,包括通過(guò)xml配置文件、注解定義、特殊方式如FactoryBean、@ImportResource、ApplicationContext以及使用@Import注解導(dǎo)入bean的方法,感興趣的朋友跟隨小編一起看看吧

一、xml配置文件

配置文件spring-bean.xml

<?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="person" class="com.xc.entity.Person"/>
    <bean class="com.xc.entity.Person"/>
    <bean class="com.xc.entity.Person"/>
    <!--xml方式聲明第三方開(kāi)發(fā)的bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

加載xml

public class App {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-bean.xml");
        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.out.println(beanDefinitionName);
        }
    }
}

輸出結(jié)果:

person
com.xc.entity.Person#0
com.xc.entity.Person#1
dataSource

二、注解定義bean

1、使用AnnotationConfigApplicationContext對(duì)象加載

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.err.println(beanDefinitionName);
        }
    }
}
public class MyConfig {
}

  使用AnnotationConfigApplicationContext對(duì)象加載MyConfig,即使MyConfig類什么注解沒(méi)有,也會(huì)被注冊(cè)為bean。

2、加載本地類 使用的注解@Component或其他衍生注解@Service、@Controller@Repository

@Service
public class BookServiceImpl implements BookService {
}

3、加載第三方j(luò)ar類

  由于我們無(wú)法在第三方提供的技術(shù)源代碼中去添加上述4個(gè)注解,因此當(dāng)你需要加載第三方開(kāi)發(fā)的bean的時(shí)候可以使用@Component@Configuration都可以,一般引入第三方傾向于后者。

//@Component
@Configuration
public class DbConfig {
    @Bean
    public DruidDataSource dataSource(){
        return new DruidDataSource();
    }
    @Bean
    public Cat cat(){
    	Cat cat = new Cat();
    	cat.setDruidDataSource(dataSource());
    	return cat; 
    }
}
  • @Configuration(proxyBeanMethods = true):默認(rèn)設(shè)置,使用了cglib動(dòng)態(tài)代理,cat里的dataSource和@Bean創(chuàng)建的dataSource是同一個(gè)對(duì)象,可以理解為單例
  • @Configuration(proxyBeanMethods = false):此時(shí)和@Component注解功能一樣,cat里的dataSource和@Bean創(chuàng)建的dataSource不是同一個(gè)對(duì)象,可以理解為多例
  • 如果配置中@Bean標(biāo)識(shí)的方法之間不存在依賴調(diào)用的話,可以設(shè)置為false,可以避免攔截方法進(jìn)行代理操作,提升性能

三、特殊方式

3.1、使用FactroyBean接口

  • spring提供了一個(gè)接口FactoryBean,也可以用于聲明bean
  • 實(shí)現(xiàn)了FactoryBean接口的類造出來(lái)的對(duì)象不是當(dāng)前類的對(duì)象,而是FactoryBean接口泛型指定類型的對(duì)象
  • 一般用來(lái)創(chuàng)建復(fù)雜對(duì)象
public class DogFactoryBean implements FactoryBean<Dog> {
    //創(chuàng)建bean的復(fù)雜過(guò)程
    @Override
    public Dog getObject() throws Exception {
        Dog d = new Dog();
        //.........
        return d;
    }
    //bean的類型
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    //bean是否單例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

配置類

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

啟動(dòng)類

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println(context.getBean("dog"));
    }
}

3.2、注解導(dǎo)入XML格式配置的bean

  • 場(chǎng)景:舊項(xiàng)目xml配置bean融入配置類項(xiàng)目中
  • @ImportResource在配置類上直接寫上要被融合的xml配置文件名即可
@Configuration
@ImportResource(locations = "spring-bean.xml")
public class SpringConfig {
}

3.3、通過(guò)上下文ApplicationContext注冊(cè)bean

在容器初始化完成后手動(dòng)加載bean,創(chuàng)建方式很多

在這里插入圖片描述

方式一:無(wú)參構(gòu)造

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        //上下文容器對(duì)象已經(jīng)初始化完畢后,手工加載bean
        ctx.register(Mouse.class);
    }
}

方式二:多參構(gòu)造

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        //上下文容器對(duì)象已經(jīng)初始化完畢后,手工加載bean
        ctx.registerBean("tom", Cat.class,"花貓",3);
    }
}

四、@Import注解注入bean

1、@Import導(dǎo)入普通類

  • 場(chǎng)景:將一個(gè)無(wú)任何注解的類加載為bean
  • 一個(gè)類@Improt只能用一次,想要導(dǎo)入多個(gè)使用{…,…}
  • 只有MyConfig加載為bean,@Import才生效
@Configuration
//@Import(Pig.class)
@Import({Dog.class,Cat.class})
public class MyConfig {
}
public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.err.println(beanDefinitionName);
        }
    }
}

輸出結(jié)果:

myConfig
com.xc.springboot.bean.Dog
com.xc.springboot.bean.Cat

2、@Import導(dǎo)入實(shí)現(xiàn)了ImportSelector接口的類

  • 可以通過(guò)添加判斷語(yǔ)句就可以實(shí)現(xiàn)對(duì)bean的加載控制
  • 返回值為多個(gè)全路徑類名字符串
  • metadata為@Import注解類的元數(shù)據(jù),可以拿到MyConfig類上所有的注解,注解里的屬性,繼承的接口,父類等等信息
  • 如下則是判斷MyCofig類上有@Configuration注解則加載Dog類,否則加載Cat類
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        System.out.println("元數(shù)據(jù)Class名稱:" + metadata.getClassName());
        //各種條件的判定,判定完畢后,決定是否裝載指定的bean
        boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if(flag){
            return new String[]{"com.xc.springboot.bean.Dog"};
        }
        return new String[]{"com.xc.springboot.bean.Cat"};
    }
}

配置類

@Configuration
@Import(MyImportSelector.class)
public class MyConfig {
}

啟動(dòng)類

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.err.println(beanDefinitionName);
        }
    }
}

輸出結(jié)果:

元數(shù)據(jù)Class名稱:com.xc.springboot.bean.MyConfig
myConfig
com.xc.springboot.bean.Dog

3、@Import導(dǎo)入實(shí)現(xiàn)了ImportBeanDefinitionRegistrar接口的類

  • 返回值為void,通過(guò)Bean定義(beanDefinition)注冊(cè)創(chuàng)建新的bean
  • 同樣可以通過(guò)添加判斷語(yǔ)句就可以實(shí)現(xiàn)bean的加載控制,更加細(xì)粒度判斷bean
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = 	
            BeanDefinitionBuilder.rootBeanDefinition(BookService.class).getBeanDefinition();
        registry.registerBeanDefinition("bookService",beanDefinition);
    }
}

4、@Import導(dǎo)入實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類

  • BeanDefinitionRegistryPostProcessor接口,其中有兩個(gè)重要的方法:
    • postProcessBeanDefinitionRegistry:用于注冊(cè)新的BeanDefinition
    • postProcessBeanFactory:用于在BeanFactory準(zhǔn)備好后進(jìn)行自定義操作
  • BeanDefinitionRegistryPostProcessor:bean定義注冊(cè)最后的處理器(在以上處理后執(zhí)行此操作),如果想bean最后確定一個(gè)值,可以在這里操作
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 通過(guò) BeanDefinitionBuilder 創(chuàng)建一個(gè)新的 Bean 定義
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyCustomBean.class);
        // 注冊(cè)這個(gè) bean 定義到 registry 中
        registry.registerBeanDefinition("myCustomBean", builder.getBeanDefinition());
        System.out.println("Bean definition registered: myCustomBean");
    }
    @Override
    public void postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 在這里可以對(duì) BeanFactory 進(jìn)行進(jìn)一步的配置
        System.out.println("Bean factory post-processing");
    }
}

注意:所有通過(guò)@Import導(dǎo)入的bean名稱為全路徑名

到此這篇關(guān)于SpringBoot基礎(chǔ)(四):bean的多種加載方式的文章就介紹到這了,更多相關(guān)SpringBoot bean加載方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot的項(xiàng)目API版本控制方式

    SpringBoot的項(xiàng)目API版本控制方式

    本文主要講述了如何通過(guò)自定義版本控制來(lái)實(shí)現(xiàn)接口版本的管理,主要包括自定義版本號(hào)標(biāo)記注解,重寫RequestCondition和RequestMappingHandlerMapping以實(shí)現(xiàn)自定義的URL匹配邏輯,以及配置注冊(cè)自定義的WebMvcRegistrations,最后通過(guò)測(cè)試接口頁(yè)面驗(yàn)證了效果
    2026-05-05
  • java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下
    2013-03-03
  • Java多線程之中斷線程(Interrupt)的使用詳解

    Java多線程之中斷線程(Interrupt)的使用詳解

    interrupt字面上是中斷的意思,但在Java里Thread.interrupt()方法實(shí)際上通過(guò)某種方式通知線程,并不會(huì)直接中止該線程
    2013-05-05
  • java校驗(yàn)json的格式是否符合要求的操作方法

    java校驗(yàn)json的格式是否符合要求的操作方法

    在日常開(kāi)發(fā)過(guò)程中,會(huì)有這樣的需求,校驗(yàn)?zāi)硞€(gè)json是否是我們想要的數(shù)據(jù)格式,這篇文章主要介紹了java校驗(yàn)json的格式是否符合要求,需要的朋友可以參考下
    2023-04-04
  • java web實(shí)現(xiàn)自動(dòng)登錄

    java web實(shí)現(xiàn)自動(dòng)登錄

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)自動(dòng)登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java代理模式(jdk proxy)

    java代理模式(jdk proxy)

    代理(Proxy)是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象另外的訪問(wèn)方式;這篇文章主要介紹了Java 中的三種代理模式,需要的朋友可以參考下,希望能幫助到你
    2021-07-07
  • SpringBootTest測(cè)試時(shí)不啟動(dòng)程序的問(wèn)題

    SpringBootTest測(cè)試時(shí)不啟動(dòng)程序的問(wèn)題

    這篇文章主要介紹了SpringBootTest測(cè)試時(shí)不啟動(dòng)程序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring AOP常見(jiàn)使用場(chǎng)景、術(shù)語(yǔ)及設(shè)計(jì)模式應(yīng)用方式

    Spring AOP常見(jiàn)使用場(chǎng)景、術(shù)語(yǔ)及設(shè)計(jì)模式應(yīng)用方式

    AOP是一種編程思想,可以將橫切關(guān)注點(diǎn)從業(yè)務(wù)邏輯中分離出來(lái),以便更好地管理和維護(hù),它通過(guò)使用Aspect、JoinPoint、Advice等術(shù)語(yǔ)來(lái)實(shí)現(xiàn),代理、裝飾器和攔截器等設(shè)計(jì)模式在AOP中經(jīng)常被使用
    2024-12-12
  • java Arrays工具類實(shí)例詳解

    java Arrays工具類實(shí)例詳解

    這篇文章主要介紹了java Arrays工具類實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 將Java對(duì)象序列化成JSON和XML格式的實(shí)例

    將Java對(duì)象序列化成JSON和XML格式的實(shí)例

    下面小編就為大家分享一篇將Java對(duì)象序列化成JSON和XML格式的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論

正安县| 建阳市| 漯河市| 四子王旗| 井冈山市| 鄯善县| 潼关县| 新安县| 兴海县| 松滋市| 行唐县| 竹北市| 金塔县| 元江| 祁东县| 高尔夫| 广汉市| 宁德市| 张掖市| 顺义区| 宁国市| 栾城县| 澄江县| 吉木萨尔县| 鸡泽县| 永城市| 阳江市| 灵宝市| 静安区| 呼图壁县| 颍上县| 余干县| 和平区| 万全县| 璧山县| 天峻县| 延庆县| 桃江县| 东山县| 田东县| 阿鲁科尔沁旗|