国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring——Bean注入幾種方式(放入容器)

這篇具有很好參考價(jià)值的文章主要介紹了Spring——Bean注入幾種方式(放入容器)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

個(gè)人博客: 全是干貨,相信不會讓你失望

1.XML方式注入

在現(xiàn)在這個(gè)Springboot橫行的年代,以XML來注入的方式可能已經(jīng)不多見了,因?yàn)閴焊貌恢?,但畢竟是注入方式之一也得提一提,這種方式就是依賴于XML的解析來獲取我們需要注入的Bean對象

常見的方式有:set方法注入、構(gòu)造方法注入

這里舉幾個(gè)常見的例子:

set方式注入
// 實(shí)體類如下:
@Data
public class test {
    private String  name;
    private Integer sex;
}

// 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">
    <!--set方式注入
           id是注入bean中的名字
           class 是全限定類名
           property 是按照set方式注入
       -->
    <bean id="student1" class="com.example.spkie.model.test">
        <property name="name" value="test"/>
        <property name="sex" value="10"/>
    </bean>
</beans>

測試:

Spring——Bean注入幾種方式(放入容器)

構(gòu)造方法注入
// 實(shí)體類如下: 
@Data
public class test {
    private String  name;
    private Integer sex;
    
     public test(String name,Integer sex){
        this.name=name;
        this.sex=sex;
    }
}

// XML文件如下 test.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">
    <!--set方式注入
        id是注入bean中的名字
        class 是全限定類名
        constructor-arg 是按照構(gòu)造方式注入
        index 是按照成員變量在構(gòu)造函數(shù)中的參數(shù)的第幾個(gè)
        name 表示成員變量名
        type 表示類型
        value 表示值
        ref 表示引用 可引用另外一個(gè)注入到Spring的中的值
    -->
    <bean id="student1" class="com.example.spkie.model.test">
        <constructor-arg index="0" name="name" value="構(gòu)造方法注入"></constructor-arg>
        <constructor-arg index="1" name="sex" value="50"></constructor-arg>
    </bean>
</beans>

測試:

Spring——Bean注入幾種方式(放入容器)

2.注解方式注入

@Component+@ComponentScan

我們開發(fā)中常用的 @Service@Controller 都是 @Component下的注解 ,需要配合 @ComponentScan 注解才能被掃描到并放入IOC容器中

為什么平時(shí)卻沒用@ComponentScan注解呢?

因?yàn)槠綍r(shí)用的都是Springboot,Springboot啟動(dòng)類上的 @SpringbootApplication 注解類下已經(jīng)帶有 @ComponentScan 注解了,默認(rèn)掃描啟動(dòng)類同級包下的@Component

例子如下:

我們先準(zhǔn)備一個(gè)獲取IOC容器內(nèi)bean 的工具類 SpringUtils

@Component
public final class SpringUtils implements BeanFactoryPostProcessor {
    /**
     * Spring應(yīng)用上下文環(huán)境
     */
    private static ConfigurableListableBeanFactory beanFactory;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }

    public static <T> T getBean(Class<T> clz) throws BeansException {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }
    
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }
}

測試要注入的Bean實(shí)體類:

@Component
@Data
public class ComponentTest {
    private String name="@Component 注解注入";
    private String remark="注意需要配合@ComponentScan 注解使用";
}

Spring——Bean注入幾種方式(放入容器)

可以看到報(bào)錯(cuò)了,壓根找不到這個(gè)bean,因?yàn)槲覀兩厦嬲f過了springboot默認(rèn)掃描的是啟動(dòng)類同級下的路徑,我們把啟動(dòng)類放到了獨(dú)立的包下,所以掃描不到了,這時(shí)候我們要么在用@ComponentScan注解配置一次掃描路徑,要么把啟動(dòng)類提出來,我這里演示前者

我們在啟動(dòng)類上加上@ComponentScan注解配置一次掃描路徑,就可以看到注入成功啦

Spring——Bean注入幾種方式(放入容器)

@Configuration+@Bean+@ComponentScan

@Configuration注解相信大家也都不陌生,這個(gè)注解同樣要配合@ComponentScan使用,那到底和@Component有什么區(qū)別呢?

@Configuration注入的是CGlib代理類,@Component注入的是類本身

我們與 @Component 一樣準(zhǔn)備個(gè) @Configuration 注入類:

@Configuration
@Data
public class ConfigurationTest {
    private String name="@Configuration 注解注入";
    private String remark="注意需要配合@ComponentScan 注解使用";
}

Spring——Bean注入幾種方式(放入容器)

可以看到Bean類的本質(zhì)區(qū)別,難道為了這個(gè)就搞了@Configuration注解嗎?當(dāng)然不是,這個(gè)注解還可以配合@Bean注解一起使用,用來同時(shí)注入多個(gè)Bean

// 添加一個(gè)額外的Bean對象
public class ConfigurationTestBean {

    public void test(){
        System.out.println("我是在Configuration 內(nèi)部注入的 bean ");
    }

}

// ConfigurationTest中添加Bean方法

@Configuration
@Data
public class ConfigurationTest {
    private String name="@Configuration 注解注入";
    private String remark="注意需要配合@ComponentScan 注解使用";
    // ConfigurationTest 中需要注入的Bean
    @Bean
    public ConfigurationTestBean configurationTestBean(){
        return new ConfigurationTestBean();
    }
}

Spring——Bean注入幾種方式(放入容器)

這樣的@Bean可以在同一個(gè)類中注入多個(gè),所以 @Component 更多的用來注入配置文件類,@Configuration 更多的用來注入多個(gè)實(shí)例類

@Import

這種方式一般用在第三方包的加載比較多,使用起來呢也簡單需要注入哪個(gè)Bean,導(dǎo)入哪個(gè)Bean的class就可以了,例如:

// 導(dǎo)入單個(gè)Bean
@Import(xxxxBean.class)

// 導(dǎo)入多個(gè)Bean
@Import({xxxxBean.class,xxxxBean.class})


但這個(gè)注解使用得注意,一定要能被掃描到才行,可以直接放在啟動(dòng)類上,如果是普通需要配合@Component或者@Configuration來使用,因?yàn)榇俗⒔鈫为?dú)使用是不會被掃描到的,也就不會被加載了

在一個(gè)注解上導(dǎo)入多個(gè)Bean要寫這么多可能不是很優(yōu)雅,所以還可以配合ImportSelector接口使用:

// 導(dǎo)入實(shí)現(xiàn)了ImportSelector接口的類即可
@Import(MyImportSelector.class)

// 實(shí)現(xiàn)ImportSelector 在數(shù)組中配置需要導(dǎo)入的Bean路徑  返回一個(gè)數(shù)組
public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.example.spkie.importTest.xxxxBean","com.example.spkie.importTest.xxxxBean"};
    }
}

3.實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口

看接口名稱就知道了是不是有點(diǎn)像Bean的注冊接口,需要配合@Import使用:

// 使用注解注入
@Import({MyImportBeanDefinitionRegistrar.class})

// 需要注入的Bean
public class DefinitionRegistrarBean {
    public void test(){
        System.out.println("我是通過Bean注冊接口注入的Bean,需要配合@Import注解同樣需要被掃描");
    }
}
// 自定義類
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(DefinitionRegistrarBean.class);
        registry.registerBeanDefinition("definitionRegistrarBean",beanDefinitionBuilder.getBeanDefinition());
    }
}

測試:

Spring——Bean注入幾種方式(放入容器)

我們平時(shí)開發(fā)中常用的openfeign也是采用的這種方式:

Spring——Bean注入幾種方式(放入容器)

4.實(shí)現(xiàn)FactoryBean

用這個(gè)得先搞清楚FactoryBean和BeanFactory的區(qū)別:

  • BeanFactory: IOC容器頂層接口,用來Bean容器管理
  • FactoryBean: 是一個(gè)bean,是一個(gè)能產(chǎn)生bean的工廠bean,本身也會作為bean給容器管理,所以作為一個(gè)能產(chǎn)生Bean的工廠,我們可以自定義Bean(這也是最關(guān)鍵的點(diǎn))

讓我們來看看怎么用:

// 這是我們利用工廠想要生產(chǎn)的bean
public class FactoryTestBean {
    public void test(){
        System.out.println("我是通過實(shí)現(xiàn)FactoryBean接口注入的Bean");
    }
}

// 工廠Bean 實(shí)現(xiàn)兩個(gè)方法
@Component
public class MyFactoryBean implements FactoryBean<FactoryTestBean> {

   //這個(gè)方法就是我們要生產(chǎn)的Bean
    @Override
    public FactoryTestBean getObject() throws Exception {
        return new FactoryTestBean();
    }

    @Override
    public Class<?> getObjectType() {
        return FactoryTestBean.class;
    }
}

測試:

可以看到通過Class無論是工廠bean還是工廠生產(chǎn)的bean我們都可以獲取,但是發(fā)現(xiàn)通過beanName獲取bean的區(qū)別沒有,我們通過工廠的beanName獲取到的是實(shí)際生產(chǎn)的對象,要獲取真正的工廠需要在beanName前面加上&

為什么通過工廠的beanName獲取到的是實(shí)際生產(chǎn)的對象?

其實(shí)從上述注入的過程中也能看到我們往容器中注入的其實(shí)是工廠Bean,并沒有注入工廠生產(chǎn)的那個(gè)對象(可以打印容器所有的beanName驗(yàn)證),可以理解為在從容器中獲取Bean的時(shí)候有判斷是否實(shí)現(xiàn)了FactoryBean接口,實(shí)現(xiàn)了則會調(diào)用該bean的getObject()方法返回,所以此時(shí)會返回實(shí)際工廠生產(chǎn)的對象了

Spring——Bean注入幾種方式(放入容器)

我們一樣以openfeign框架舉例:

此注入的feign接口實(shí)際注入的是FeignClientFactoryBean,所以在調(diào)用容器中feign接口的Bean對象的時(shí)候,實(shí)際執(zhí)行的是FeignClientFactoryBean.getObject()方法

Spring——Bean注入幾種方式(放入容器)

5.實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor

這個(gè)接口繼承了BeanFactoryPostProcessor接口,BeanFactoryPostProcessor是BeanFactory的后置處理器,該接口多個(gè)了一個(gè)對BeanDefination處理的方法,可以在BeanFactory生成后對里面的BeanDefination做一次處理,所以當(dāng)然可以注冊BeanDefination啦,后續(xù)就成了Bean

BeanDefinitionRegistryPostProcessor源代碼如下:

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}

怎么用呢?先直接上例子吧:

// 還是要搭配注解
@Import(MyBeanDefinitionRegistryPostProcessor.class)

// 要注入的bean對象
public class RegistrarPostProcessorBean {
    public void test(){
        System.out.println("我是通過后置處理器注入的bean");
    }
}
// 自定義類
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(RegistrarPostProcessorBean.class);
        beanDefinitionRegistry.registerBeanDefinition("registrarPostProcessorBean",beanDefinitionBuilder.getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

乍一看和ImportBeanDefinitionRegistrar類似,都是用了BeanDefinitionRegistry 來注冊的,但I(xiàn)mportBeanDefinitionRegistrar是Spring的擴(kuò)展點(diǎn)之一,提供給第三方對接使用的

BeanDefinitionRegistryPostProcessor這個(gè)源碼就不追溯了,后面再說(還是提一下吧,容器初始化的時(shí)候有調(diào)用)

Spring——Bean注入幾種方式(放入容器)

既然是BeanFactory后置處理器,所以它還可以修改BeanDefination里面保存的Bean信息:

// 我們用到之前使用過的Bean
@Component
@Data
public class ComponentTest {
    private String name="@Component 注解注入";
    private String remark="注意需要配合@ComponentScan 注解使用";
}

// 修改后置處理器 
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 新增如下代碼  修改ComponentTest Bean屬性
        BeanDefinition configurationTestBean = beanDefinitionRegistry.getBeanDefinition("componentTest");
        MutablePropertyValues propertyValues = configurationTestBean.getPropertyValues();
        propertyValues.add("name","我是修改后的Bean屬性" );

        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(RegistrarPostProcessorBean.class);
        beanDefinitionRegistry.registerBeanDefinition("registrarPostProcessorBean",beanDefinitionBuilder.getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

結(jié)果如下:
Spring——Bean注入幾種方式(放入容器)

這里演示了修改字段的值,當(dāng)然還可以修改其他的比如是否加載優(yōu)先級、是否懶加載、單例多例等文章來源地址http://www.zghlxwxcb.cn/news/detail-428014.html

到了這里,關(guān)于Spring——Bean注入幾種方式(放入容器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 4.3---Spring框架之Spring中bean的注入方式---(深入版本)

    Spring基于xml注入bean的幾種方式: set()方法注入; 2.構(gòu)造器注入:①通過index設(shè)置參數(shù)的位置;②通過type設(shè)置參數(shù)類型; 靜態(tài)工廠注入; 實(shí)例工廠; Spring IOC注入方式用得最多的是(1)(2)種; 注意:通過Spring創(chuàng)建的對象默認(rèn)是單例的,如果需要?jiǎng)?chuàng)建多實(shí)例對象可以在標(biāo)簽后面添

    2023年04月10日
    瀏覽(20)
  • spring(1):基于XML獲取Bean對象以及各種依賴注入方式

    1.1 根據(jù)id獲取 1.2 根據(jù)類型獲取 1.3 根據(jù)id和類型獲取 注意: 當(dāng)根據(jù)類型獲取bean時(shí),要求IOC容器中指定類型的bean有且只能有一個(gè)。 例如以下XML文件,當(dāng)IOC容器中一共配置了兩個(gè),根據(jù)類型獲取時(shí)會拋出異常。 根據(jù)類型來獲取bean時(shí),在滿足bean唯一性的前提下,其實(shí)只是看:

    2024年01月25日
    瀏覽(55)
  • 【Spring】基于注解方式存取JavaBean:Spring有幾種注入方式?有什么區(qū)別?

    【Spring】基于注解方式存取JavaBean:Spring有幾種注入方式?有什么區(qū)別?

    ?Hello,我是小黃。眾所周知,Spring是一個(gè)開源的Java應(yīng)用程序框架,其中包括許多通過注解實(shí)現(xiàn)依賴注入的功能。Spring提供了多種注入方式,可以滿足不同的需求和場景。常見的注入方式包括構(gòu)造函數(shù)注入、Setter方法注入和屬性注入。不同的注入方式有不同的適用場景和優(yōu)缺

    2024年02月11日
    瀏覽(19)
  • Spring的加載配置文件、容器和獲取bean的方式

    Spring的加載配置文件、容器和獲取bean的方式

    ??個(gè)人主頁: ?? 葉落閑庭 ??我的專欄:?? c語言 數(shù)據(jù)結(jié)構(gòu) javaweb 石可破也,而不可奪堅(jiān);丹可磨也,而不可奪赤。 properties文件: jdbc.properties 1.開啟context命名空間 2.使用context命名空間,加載指定properties文件 3.使用屬性占位符 ${} 讀取properties文件中的屬性 properties文件

    2024年02月15日
    瀏覽(21)
  • Spring容器獲取Bean的9種方式 | 京東云技術(shù)團(tuán)隊(duì)

    Spring容器獲取Bean的9種方式 | 京東云技術(shù)團(tuán)隊(duì)

    隨著SpringBoot的普及,Spring的使用也越來越廣,在某些場景下,我們無法通過注解或配置的形式直接獲取到某個(gè)Bean。比如,在某一些工具類、設(shè)計(jì)模式實(shí)現(xiàn)中需要使用到Spring容器管理的Bean,此時(shí)就需要直接獲取到對應(yīng)的Bean。 本文為大家整理匯總了常見的獲取Bean的方式,并提

    2024年02月12日
    瀏覽(19)
  • 實(shí)戰(zhàn)講解及分析Spring新建Bean的幾種方式以及創(chuàng)建過程(圖+文+源碼)

    實(shí)戰(zhàn)講解及分析Spring新建Bean的幾種方式以及創(chuàng)建過程(圖+文+源碼)

    作為一個(gè)應(yīng)用開發(fā)人員而言,會使用某一個(gè)工具分為兩個(gè)層次(個(gè)人觀點(diǎn)): 第一個(gè)層次,知道工具,會使用這個(gè)工具解決問題; 第二個(gè)層次,理解工具的實(shí)現(xiàn)原理。 關(guān)于Spring的學(xué)習(xí),還在第一個(gè)層次轉(zhuǎn)悠,缺少原理的研究, 隨著學(xué)習(xí)的深入,開始研究些Spring源碼,配合

    2023年04月08日
    瀏覽(18)
  • Spring的簡介ioc容器及注入方式

    Spring的簡介ioc容器及注入方式

    Spring是一個(gè)開源框架,它由Rod Johnson創(chuàng)建。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。 ???Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。 ???然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Sprin

    2024年02月11日
    瀏覽(19)
  • spring ico容器 spring注入方式 spring與tomcat整合

    spring ico容器 spring注入方式 spring與tomcat整合

    目錄 一、簡介 1、什么是spring? 2、目的 3、功能及使用范圍 二、spring IOC 1、ioc的理解 2、開發(fā)人員可達(dá)到的目的 3、分析實(shí)現(xiàn) 4、bean配置 三、spring IOC的注入方式 1、set方法屬性注入 2、構(gòu)造注入 3、自動(dòng)裝配 四、spring與tomcat的整合/spring與web容器的整合 五、spring AOP 1、aop的特

    2024年02月12日
    瀏覽(22)
  • 【Spring學(xué)習(xí)】走進(jìn)spring,spring的創(chuàng)建和使用,spring獲取Bean的幾種常見方式, ApplicationContext 和 BeanFactory的區(qū)別(重點(diǎn)面試)

    【Spring學(xué)習(xí)】走進(jìn)spring,spring的創(chuàng)建和使用,spring獲取Bean的幾種常見方式, ApplicationContext 和 BeanFactory的區(qū)別(重點(diǎn)面試)

    前言: 大家好,我是 良辰丫 ,我們在上一篇文章不是簡單介紹了SpringBoot嘛,為什么不學(xué)習(xí)SpringBoot,而是要開始Spring呢?Spring是SpringBoot的前身,我們先學(xué)習(xí)以前的稍微復(fù)雜的框架,才能更好的學(xué)習(xí)SpringBoot.?????? ??個(gè)人主頁:良辰針不戳 ??所屬專欄:javaEE進(jìn)階篇之框架學(xué)習(xí) ??勵(lì)志

    2024年02月08日
    瀏覽(24)
  • 【Spring】1、Spring 框架的基本使用【讀取配置文件、IoC、依賴注入的幾種方式、FactoryBean】

    【Spring】1、Spring 框架的基本使用【讀取配置文件、IoC、依賴注入的幾種方式、FactoryBean】

    Spring 框架可以說是 Java 開發(fā)中最重要的框架,功能 非常 強(qiáng)大 中文文檔:https://springdoc.cn/spring/ 官網(wǎng):https://spring.io/ Spring makes Java Simple、modern、productive … Spring 框架的幾個(gè)核心概念: IoC: I nversion o f C ontrol:控制反轉(zhuǎn) DI: D ependency I njection:依賴注入 AOP: A spect O riented P rogram

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包