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

SpringBoot加載bean的八種方式總結(jié)

 更新時(shí)間:2022年10月28日 10:15:28   作者:執(zhí)久呀  
springboot難免要用到bean,但這些bean如何導(dǎo)入,對(duì)于初學(xué)者時(shí)間頭疼的事,下面這篇文章主要給大家介紹了關(guān)于SpringBoot加載bean的八種方式,需要的朋友可以參考下

第一種bean的加載方式-配置文件

先創(chuàng)建一個(gè)使用maven的spring工程

導(dǎo)入spring核心配置

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.9</version>
        </dependency>

創(chuàng)建一個(gè)類(lèi)

public  class Cat {
    
}
public class Dog {
}

創(chuàng)建一個(gè)名為applicationContext.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">
 
    <bean id="cat" class="com.service.Cat"/>
<bean id="dog" class="com.service.Dog"/>
 
</beans>

創(chuàng)建一個(gè)啟動(dòng)類(lèi)

package com.app;
 
import com.service.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App1 {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        Object cat = app.getBean("cat");//根據(jù)id獲取
        System.out.println(cat);
        Object dog = app.getBean(Dog.class);//根據(jù)類(lèi)獲取,當(dāng)不唯一時(shí)會(huì)報(bào)錯(cuò)
        System.out.println(dog);
 
    }
}

運(yùn)行結(jié)果,這樣就可以得到bean的對(duì)象了

或者使用可以使用一次性獲取所有bean

public class App1 {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
 
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

 運(yùn)行結(jié)果

 第二種加載bean方式-注解和掃描

使用注解,注解的作用就是替代配置文件的配置,注解有@Component @Service @Repository等

替換配置文件中的<bean id= class=..>

@Component("cat") //起的名
public class Cat {
 
}
@Component
public class Dog {
}

使用完注解還得讓spring去掃描到這個(gè)注解,在配置文件中的寫(xiě)

<?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
">
 
<!--告訴spring掃描哪個(gè)包c(diǎn)omponent導(dǎo)入context命名空間-->
    <context:component-scan base-package="com"/>
    
 
</beans>

運(yùn)行結(jié)果 

創(chuàng)建第三方的bean對(duì)象

先導(dǎo)入對(duì)應(yīng)的坐標(biāo)

               <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                    <version>1.1.24</version>
                </dependency>

創(chuàng)建一個(gè)類(lèi),返回你需要導(dǎo)入的對(duì)象即可,加入注解 

package com.config;
 
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
 
@Component
public class DBconfig {
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource ds =new DruidDataSource();
        return ds;
    }
}

運(yùn)行結(jié)果

 第三種加載bean方式-不使用配置文件

創(chuàng)建一個(gè)類(lèi)代替配置文件

package com.config;
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration//定義為配置類(lèi)
@ComponentScan({"com.config","com.service"}) //注解掃描包
public class springConfig {
}

運(yùn)行類(lèi)也得修改

package com.app;
 
import com.config.springConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App2 {
    public static void main(String[] args) {
ApplicationContext app=new AnnotationConfigApplicationContext(springConfig.class);
 
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

運(yùn)行結(jié)果 

擴(kuò)展-bean的加載方式擴(kuò)展FactoryBean<>

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

實(shí)現(xiàn)了FactoryBean接口創(chuàng)建出來(lái)的對(duì)象不是本身而是里面的泛型。

創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)接口

package com.config;
 
import com.service.Dog;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.Bean;
 
public class DogFactoryBean implements FactoryBean<Dog> {
    public Dog getObject() throws Exception {
        return new Dog();
    }
//返回對(duì)象的類(lèi)型
    public Class<?> getObjectType() {
 
        //這里可以做一系列的初始化工作
        return Dog.class;
    }
 
    //是否是單例,單例則多次獲取都是一個(gè)對(duì)象
    public boolean isSingleton() {
        return false;
    }
}
@Component
public class Dog {
}

啟動(dòng)的主類(lèi) 

import com.config.springConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App2 {
    public static void main(String[] args) {
ApplicationContext app=new AnnotationConfigApplicationContext(springConfig.class);
 
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        System.out.println(app.getBean("dog1"));
        System.out.println(app.getBean("dog1"));
    }
}

運(yùn)行結(jié)果

 產(chǎn)生的是泛型的對(duì)象

擴(kuò)展-@ImportResource導(dǎo)入配置文件

 看源碼可知道,可以寫(xiě)入多個(gè)string類(lèi)型的數(shù)組,使用{}

@ImportResource({"applicationContext2.xml","applicationContext.xml"})

@Configuration
@ComponentScan("com")
@ImportResource({"applicationContext2.xml","applicationContext.xml"})
public class SpringConfig2 {
    @Bean
    public Cat cat(){
        return new Cat();
    }
}

 兩個(gè)配置文件中的bean,排在前面的首先加載,后面的之后加載,同的內(nèi)容以之后的為主,不同的內(nèi)容都加載。

擴(kuò)展-proxyBeanMethods屬性-產(chǎn)生代理對(duì)象

@Configuration注解中有一屬性proxyBeanMethod屬性,默認(rèn)值是true

 值為false時(shí)

@Configuration(proxyBeanMethods = false)
@ComponentScan("com")
@ImportResource({"applicationContext2.xml","applicationContext.xml"})
public class SpringConfig2 {
    @Bean
    public Cat cat(){
        return new Cat();
    }
}

主方法中

public class app3 {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(SpringConfig2.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
 
        System.out.println("--------");
        System.out.println(app.getBean("springConfig2"));
 
        SpringConfig2 springConfig2 = app.getBean("springConfig2", SpringConfig2.class);
        System.out.println(springConfig2.cat());
        System.out.println(springConfig2.cat());
        System.out.println(springConfig2.cat());
 
    }
}

運(yùn)行結(jié)果 

 產(chǎn)生的是普通對(duì)象,每一次調(diào)用方法都會(huì)new一個(gè)新的對(duì)象前提是這個(gè)方法是被bean管理的對(duì)象。

  值為true時(shí)

不寫(xiě)或?qū)憈rue時(shí)

@Configuration(proxyBeanMethods = true)
@ComponentScan("com")
@ImportResource({"applicationContext2.xml","applicationContext.xml"})
public class SpringConfig2 {
    @Bean
    public Cat cat(){
        return new Cat();
    }
}

運(yùn)行結(jié)果

 會(huì)產(chǎn)生一個(gè)代理對(duì)象,這個(gè)代理對(duì)象讓我們每次調(diào)用方法是都是同一個(gè),前提也是需要被bean容器管理

注:產(chǎn)生的bean對(duì)象沒(méi)指定名稱(chēng)時(shí),默認(rèn)是方法名或類(lèi)名首字母小寫(xiě),如類(lèi)名是SpringTest則產(chǎn)生的bean是springTest 

第四種加載bean方式-使用@Import

翻看@Import源碼可知,需要一個(gè)類(lèi)class字節(jié)碼對(duì)象

 在類(lèi)中

import com.service.TestBean1;
import com.service.TestBean2;
import org.springframework.context.annotation.Import;
 
@Import({TestBean1.class, TestBean2.class})
public class springConfig4 {
}

 創(chuàng)建測(cè)試的類(lèi)

public class TestBean1 {
}
public class testBean2 {
}

主類(lèi)上

public class app4 {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(springConfig4.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
 
    }
}

運(yùn)行結(jié)果

 全路徑名,加入的類(lèi)即使沒(méi)有被spring管理也可以產(chǎn)生bean。

第五種加載bean方式-registerBean

使用上下文對(duì)象在容器初始化后注入bean

在創(chuàng)建完上下文對(duì)象的時(shí)候可以加載bean

只能使用 AnnotationConfigApplicationContext獲取上下文對(duì)象

public class app5 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(springConfig5.class);
    //加載完成后
        app.registerBean("CaiDog", Dog.class,1 );
        app.registerBean("CaiDog", Dog.class,2);
        app.registerBean("CaiDog", Dog.class,3 );
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
 
        System.out.println("------");
        System.out.println(app.getBean(Dog.class));
    }
}

 Dog類(lèi)下

@Component
public class Dog {
 
    int age;
    public Dog(){}
 
    public Dog(int age){
        this.age=age;
    }
 
    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                '}';
    }
}

運(yùn)行結(jié)果 ,當(dāng)有多個(gè)的時(shí)候,且bean的名字一致時(shí),以最后的為準(zhǔn)。

或者直接使用

app.register(Cat.class);

也可以快速的加載一個(gè)bean

第六種加載bean方式-實(shí)現(xiàn)ImportSelector接口

這個(gè)接口有許多方法用來(lái)判定

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

public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata annotationMetadata) {//AnnotationMetadata 注解的源數(shù)據(jù)
     //  做判定條件,是否有這個(gè)注解
        boolean flag = annotationMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if (flag){
            return new String[]{"com.service.Dog"};
        }
 
        return new String[]{"com.service.Cat"};
    }
}
@Import({MyImportSelector.class})
public class SpringConfig6 {
}
public class app6 {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(SpringConfig6.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
 
 
    }
}

運(yùn)行結(jié)果 

 第七種加載bean方式-實(shí)現(xiàn)ImportBeanDefinitionRegistrar

導(dǎo)入實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口的類(lèi),通過(guò)BeanDefinition的注冊(cè)器注冊(cè)實(shí)名bean,實(shí)現(xiàn)對(duì)容器中bean的決定,例如對(duì)現(xiàn)有的bean的覆蓋,進(jìn)而達(dá)到

import com.service.Dog;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition= BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
        registry.registerBeanDefinition("woDog", beanDefinition);
    }
}
@Import({MyRegistrar.class})
public class SpringConfig7 {
}

 運(yùn)行結(jié)果

第八種bean的加載方式-實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor

導(dǎo)入實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類(lèi),通過(guò)BeanDefintion的注冊(cè)器注冊(cè)實(shí)名bean,實(shí)現(xiàn)對(duì)容器中bean的最終裁定.(以這個(gè)接口加載的bean為主)

@Component
public class DBconfig {
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource ds =new DruidDataSource();
        return ds;
    }
}
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
 BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(DBconfig.class).getBeanDefinition();
 
    registry.registerBeanDefinition("dataSource",beanDefinition);
    }
 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 
    }
}
@Import({MyPostProcessor.class})
public class SpringConfig8 {
}

運(yùn)行結(jié)果

 實(shí)現(xiàn)bean的方式總結(jié)

1.xml+<bean/>

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

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

@Bean定義FactoryBean接口@ImportResource@Configuration注解的proxyBeanMethods屬性

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

@Import導(dǎo)入配置類(lèi)

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

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

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

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

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

相關(guān)文章

  • 詳解Java中的Reflection反射和暴力反射

    詳解Java中的Reflection反射和暴力反射

    本文主要介紹了詳解Java中的Reflection反射和暴力反射,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 基于Spring上下文工具類(lèi)?ApplicationContextUtil

    基于Spring上下文工具類(lèi)?ApplicationContextUtil

    這篇文章主要介紹了基于Spring上下文工具類(lèi)?ApplicationContextUtil,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中的Caffeine加載與驅(qū)逐策略詳解

    Java中的Caffeine加載與驅(qū)逐策略詳解

    這篇文章主要介紹了Java中的Caffeine加載與驅(qū)逐策略詳解,Caffeine是基于Java 8的高性能緩存庫(kù),可提供接近最佳的命中率,Caffeine與ConcurrentMap相應(yīng),但是不完全相同,本文主要介紹Caffeine,需要的朋友可以參考下
    2023-10-10
  • java時(shí)間戳與日期相互轉(zhuǎn)換工具詳解

    java時(shí)間戳與日期相互轉(zhuǎn)換工具詳解

    這篇文章主要為大家詳細(xì)介紹了java各種時(shí)間戳與日期之間相互轉(zhuǎn)換的工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java線(xiàn)程的異常處理機(jī)制詳情

    Java線(xiàn)程的異常處理機(jī)制詳情

    這篇文章主要介紹了Java線(xiàn)程的異常處理機(jī)制詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 使用Jmeter進(jìn)行http接口測(cè)試的詳細(xì)流程

    使用Jmeter進(jìn)行http接口測(cè)試的詳細(xì)流程

    本文主要針對(duì)http接口進(jìn)行測(cè)試,使用Jmeter工具實(shí)現(xiàn),  Jmter工具設(shè)計(jì)之初是用于做性能測(cè)試的,它在實(shí)現(xiàn)對(duì)各種接口的調(diào)用方面已經(jīng)做的比較成熟,因此,本次直接使用Jmeter工具來(lái)完成對(duì)Http接口的測(cè)試,需要的朋友可以參考下
    2024-12-12
  • centos7安裝java的多種方式總結(jié)

    centos7安裝java的多種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于centos7安裝java的多種方式,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java寫(xiě)入寫(xiě)出Excel操作源碼分享

    Java寫(xiě)入寫(xiě)出Excel操作源碼分享

    這篇文章主要介紹了Java寫(xiě)入寫(xiě)出Excel操作源碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志

    springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志

    這篇文章主要介紹了springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 在Java中將List轉(zhuǎn)換為String輸出過(guò)程解析

    在Java中將List轉(zhuǎn)換為String輸出過(guò)程解析

    這篇文章主要介紹了在Java中將List轉(zhuǎn)換為String輸出過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

东平县| 永福县| 普洱| 诸城市| 山阳县| 宁晋县| 巴南区| 堆龙德庆县| 秀山| 鄂托克前旗| 新建县| 黑山县| 庆阳市| 安陆市| 吉水县| 元氏县| 大厂| 高陵县| 鲜城| 盐池县| 奎屯市| 富锦市| 遂昌县| 康定县| 岗巴县| 张家口市| 肃北| 河津市| 阳谷县| 金堂县| 永年县| 合水县| 双桥区| 莫力| 双辽市| 三穗县| 彭州市| 崇阳县| 张掖市| 威远县| 盐边县|