欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot加載注入bean的幾種方式

 更新時(shí)間:2024年08月21日 09:33:38   作者:FlyBeautySky  
本文主要介紹了springboot加載注入bean的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在SpringBoot的大環(huán)境下,基本上很少使用之前的xml配置Bean,主要是因?yàn)檫@種方式不好維護(hù)而且也不夠方便。

springboto注入bean主要采用下圖幾種方式,分為本地服務(wù)工程注解聲明的bean和外部依賴包中的bean。

在這里插入圖片描述

一、 springboot裝配本地服務(wù)工程中的bean

1、注解裝配Bean

1、使用Component,Service,Controller,Repository等派生注解
只要在類上加類上加 @Component 注解即可,該注解只要被掃描到就會(huì)注入到spring的bean容器中。

@Component
public class AnoDemoBean {
}

當(dāng)然不只是@Component注解可以聲明Bean,還有如:@Repository、@Service、@Controller 等常用注解同樣可以。

如果去看這些注解,就發(fā)現(xiàn)這些注解上本身就有加 @Component 注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component   //可以看到@Service注解上有添加@Component,  @Repository和@Controller也一樣。        
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

這系列注解的出現(xiàn),給我們帶來了極大的便利。我們不需要像以前那樣在bean.xml文件中配置bean了,現(xiàn)在只用在類上加上相關(guān)注解,就能輕松完成bean的定義。

這四種注解在功能上其實(shí)沒有特別的區(qū)別,不過在業(yè)界有個(gè)不成文的約定:

  • Controller 一般用在控制層
  • Service 一般用在業(yè)務(wù)層
  • Repository 一般用在數(shù)據(jù)層
  • Component 一般用在公共組件上

2、@Bean定義方式

這種方式,主要是結(jié)合Configuration來定義bean,首先是聲明一個(gè)配置類,而后再配置類中,經(jīng)過返回bean對(duì)象的方法形式來聲明bean,通常使用姿式以下

@Data
public class ConfigDemoBean {
}

@Configuration
public class BeanLoadConfig {
    @Bean
    public ConfigDemoBean configDemoBean() {
        return new ConfigDemoBean();
    }
}

須要說明的一點(diǎn)是BeanLoadConfig類自己也被Spring容器看為一個(gè)Bean。

3、Component注解 VS Bean注解

1)作用對(duì)象不同:@Component 注解作用于類,而 @Bean 注解作用于方法。

@Bean 方式更加靈活,比如當(dāng)我們引用第三方庫中的類需要裝配到 Spring 容器時(shí),只能通過 @Bean 來實(shí)現(xiàn)。

比如

@Configuration
public class WireThirdLibClass {
    @Bean
    public ThirdLibClass getThirdLibClass() {
        //第三方的ThirdLibClass類
        return new ThirdLibClass();
    }
}

再比如

@Bean
public OneService getService(status) {
    case (status)  {
        when 1:
                return new serviceImpl1();
        when 2:
                return new serviceImpl2();
        when 3:
                return new serviceImpl3();
    }
}

這兩點(diǎn)都是@Component無法做到,只能@Bean實(shí)現(xiàn),所以說@Bean更加靈活。

2)@Component通常是通過類路徑掃描來自動(dòng)裝配到Spring容器中。而@Bean通常我們會(huì)在該注解的方法中定義產(chǎn)生這個(gè)bean的邏輯。

我們可以加一些@Conditional,@ConditionalOnBean等等一些注解來控制是否聲明該Bean,不會(huì)一開始就自動(dòng)裝配到Spring容器中。

比如

public class MacCondition implements Condition {

   @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment environment = conditionContext.getEnvironment();
        String property = environment.getProperty("os.name");
        if (property.contains("Mac")) {
            log.info("當(dāng)前操作系統(tǒng)是:Mac OS X");
            return true;
        }
        return false;
    }
}

@Configuration
public class ConditionalConfig {
    /**
     * 如果MacCondition的實(shí)現(xiàn)方法返回true,則注入這個(gè)bean
     */
    @Bean("mac")
    @Conditional({MacCondition.class})
    public SystemBean systemMac() {
        log.info("ConditionalConfig方法注入 mac實(shí)體");
        return new SystemBean("Mac ios系統(tǒng)","001");
    }
}

上面的例子表示,如果當(dāng)前操作系統(tǒng)是Mac,才會(huì)注入當(dāng)前Bean。這個(gè)也只能 @Bean 注解才能實(shí)現(xiàn)。

總結(jié):@Component和@Bean都是用來注冊(cè)Bean并裝配到Spring容器中,但是Bean比Component的自定義性更強(qiáng)。可以實(shí)現(xiàn)一些Component實(shí)現(xiàn)不了的自定義加載類。

二、springboot裝配依賴包中的bean

當(dāng)SpingBoot主類啟動(dòng)的時(shí)候,@SpringBootApplication注解會(huì)默認(rèn)去掃描的自己所在包路徑和它的子包路徑下的所有需要裝配的類,自動(dòng)裝配到spring的bean容器中。
但是如果你提供了一個(gè)Jar包供第三方用戶使用,那么你這個(gè)jar包中的Bean,能被第三方加載么?

這就要看你當(dāng)前項(xiàng)目的包名和你引用的第三方Jar包的包名是否一致了?如果一致,第三方依賴包中的bean可以直接加載,如果不一致,則無法加載第三方依賴中的bean。
例如,如果你當(dāng)前項(xiàng)目本包的地址是com.jincou,而你引用的第三方Jar的本包也是 com.jincou,那么第三方Jar的Bean就可以被掃描到并注入到spring的容器中。如果你當(dāng)前項(xiàng)目本包的地址是com.jincou ,而你引用的第三方Jar的本包是 com.third,那么也就是第三方Jar的Bean無法被掃描到,所以也就無法注入到Spring容器中。

比如這里有個(gè)第三方的Bean。要如何做才能被掃描注入到Spring容器中呢。

package com.third.bean;

import org.springframework.stereotype.Component;

/**
 * @Description: 這個(gè)bean作為第三方bean 給依賴該jar包的項(xiàng)目使用
 */
@Component
public class ThirdComponentBean {
    private String type = "第三方ThirdComponent注解生成bean實(shí)體";
}

1、ComponentScan注解

很簡單,既然@SpringBootApplication注解默認(rèn)掃描只是當(dāng)前項(xiàng)目的本包和它的子包,那就想辦法讓它掃描第三方j(luò)ar的包就好了。

/**
 * @Description: Springboot 啟動(dòng)類
 */
@ComponentScan(basePackages ={"com.third.bean"})
@SpringBootApplication()
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

@ComponentScan主要就是定義掃描的路徑從中找出標(biāo)識(shí)了需要裝配的類自動(dòng)裝配到spring的bean容器中。

需要裝配的類也就是上面加了@Controller,@Service,@Repository,@Component,@Configuration等等的注解的Bean到IOC容器中。

這里不一定要加在啟動(dòng)類上,你可以加在加在裝配的類上,但建議加在啟動(dòng)類上,比較直觀,后期如果要改動(dòng)或者去除也比較好找。

2、Import注解

@ComponentScan是掃描整個(gè)包,但其實(shí)你可能只需注入一個(gè)或者幾個(gè)指定的Bean,那我們可以考慮用 @Import 注解

@Import(value= com.third.bean.ThirdComponentBean.class)
@SpringBootApplication()
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

這樣做同樣也會(huì)成功的將ThirdComponentBean對(duì)象注入到Spring的bean容器中。

3、spring.factories文件中配置bean

上面兩種注入方式都有個(gè)很明顯缺點(diǎn),就是如果我需要引用外部jar包的Bean的時(shí)候,都需要在當(dāng)前項(xiàng)目配置 @ComponentScan 或者 @Import 去掃描才能注入當(dāng)前Bean,這樣顯然不夠友好。

可不可以當(dāng)前項(xiàng)目什么都不做就可以直接引用第三方j(luò)ar的Bean呢?

當(dāng)然可以。

我們只需要在將配置放在第三方j(luò)ar指定的文件中即可,使用者會(huì)自動(dòng)加載,從而避免的代碼的侵入

在資源目錄下新建目錄 META-INF
在 META-INF 目錄下新建文件 spring.factories
在文件中添加下面配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.third.bean.ConfigurationBean

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

相關(guān)文章

  • SpringBoot中@FeignClient 注解的作用

    SpringBoot中@FeignClient 注解的作用

    Feign可以幫助我們定義和實(shí)現(xiàn)服務(wù)之間的 RESTful 接口,使得服務(wù)之間的調(diào)用更加方便和可靠,本文主要介紹了SpringBoot中@FeignClient 注解的作用,感興趣的可以了解一下
    2024-06-06
  • springboot多模塊多環(huán)境配置文件問題(動(dòng)態(tài)配置生產(chǎn)和開發(fā)環(huán)境)

    springboot多模塊多環(huán)境配置文件問題(動(dòng)態(tài)配置生產(chǎn)和開發(fā)環(huán)境)

    這篇文章主要介紹了springboot多模塊多環(huán)境配置文件問題(動(dòng)態(tài)配置生產(chǎn)和開發(fā)環(huán)境),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java實(shí)戰(zhàn)技巧之if-else代碼優(yōu)化技巧大全

    java實(shí)戰(zhàn)技巧之if-else代碼優(yōu)化技巧大全

    代碼中如果if-else比較多,閱讀起來比較困難,維護(hù)起來也比較困難,很容易出bug,下面這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)技巧之if-else代碼優(yōu)化技巧的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Springboot集成JAXB返回xml格式

    Springboot集成JAXB返回xml格式

    這篇文章主要為大家詳細(xì)介紹了Springboot如何集成JAXB返回xml格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 詳解spring cloud分布式整合zipkin的鏈路跟蹤

    詳解spring cloud分布式整合zipkin的鏈路跟蹤

    這篇文章主要介紹了詳解spring cloud分布式整合zipkin的鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 簡述Java中throw-throws異常拋出

    簡述Java中throw-throws異常拋出

    任何Java代碼都可以拋出異常,本文主要介紹了Java中throw-throws異常拋出,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • 解決Jackson反序列化map,set等復(fù)雜類型問題

    解決Jackson反序列化map,set等復(fù)雜類型問題

    這篇文章主要介紹了解決Jackson反序列化map,set等復(fù)雜類型問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列

    關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列

    這篇文章主要介紹了關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列,死信隊(duì)列實(shí)際上就是一個(gè)普通的隊(duì)列,只是這個(gè)隊(duì)列跟死信交換機(jī)進(jìn)行了綁定,用來存放死信而已,需要的朋友可以參考下
    2023-05-05
  • 解析Mybatis判斷表達(dá)式源碼分析

    解析Mybatis判斷表達(dá)式源碼分析

    這篇文章主要介紹了Mybatis判斷表達(dá)式源碼分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Springmvc restful配置遇到的小坑

    Springmvc restful配置遇到的小坑

    本文是小編給大家?guī)Я说腟pringmvc restful配置遇到的小小坑,小編給大家?guī)砹藛栴}原因及解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07

最新評(píng)論