亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Springboot控制反轉(zhuǎn)與Bean對(duì)象的方法

 更新時(shí)間:2025年03月04日 14:21:13   作者:CodingFang  
文章介紹了Spring Boot中的控制反轉(zhuǎn)(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依賴關(guān)系,它詳細(xì)講解了Bean的注冊(cè)過(guò)程,包括通過(guò)@ComponentScan和@Bean注解的方式,并討論了Bean的依賴注入方法,如構(gòu)造器注入、Setter注入和字段注入,感興趣的朋友一起看看吧

1 控制反轉(zhuǎn)

1.1 什么是控制反轉(zhuǎn)

控制反轉(zhuǎn)(IoC)是一種設(shè)計(jì)原則,它將對(duì)象的創(chuàng)建、依賴注入和生命周期管理等責(zé)任從應(yīng)用程序代碼中轉(zhuǎn)移到框架或容器中

1.2 SpringBoot中的控制反轉(zhuǎn)

Spring框架通過(guò)IoC容器來(lái)管理Bean的生命周期和依賴關(guān)系,從而實(shí)現(xiàn)控制反轉(zhuǎn)

2 Ioc容器對(duì)Bean的管理

2.1 什么是Bean對(duì)象?

在Spring框架中,Bean是一個(gè)由Spring IoC容器管理的對(duì)象。Bean的創(chuàng)建、初始化、依賴注入以及銷毀都由Spring容器負(fù)責(zé)。Bean可以是任何Java對(duì)象,通常是一個(gè)POJO(Plain Old Java Object)。

2.2 Bean的注冊(cè)過(guò)程

2.2.1 掃描Bean

  • 在Spring應(yīng)用中,手動(dòng)配置每個(gè)Bean會(huì)非常繁瑣,尤其是在大型項(xiàng)目中。@ComponentScan通過(guò)自動(dòng)掃描和注冊(cè)Bean,簡(jiǎn)化了這一過(guò)程,使開發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯。
  • 在Spring Boot應(yīng)用中,@ComponentScan通常與@SpringBootApplication注解一起使用。@SpringBootApplication注解包含了@ComponentScan,默認(rèn)會(huì)掃描主類所在包及其子包。
  • 下面例子中,Spring會(huì)掃描com.example.service和com.example.repository包及其子包下的所有組件。
@Configuration   
@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})   
public class AppConfig {
}

2.2.2 定義Bean

使用@Component及其派生注解:Spring支持通過(guò)@ComponentScan自動(dòng)掃描并注冊(cè)Bean。常用的注解包括:

    @Component:通用注解,用于標(biāo)記任意類為 Bean。
    @Service:用于標(biāo)記服務(wù)層的類。
    @Repository:用于標(biāo)記數(shù)據(jù)訪問層的類。
    @Controller:用于標(biāo)記控制器層的類。
    @Configuration:用于標(biāo)記配置類。

使用@Bean注解:在配置類中,可以使用@Bean注解顯式定義Bean。@Bean通常用于定義第三方庫(kù)中的類或需要自定義配置的Bean。

@Configuration// 配置注解
public class CommonConfig {
    /**
     * @Bean注解標(biāo)注的方法會(huì)被 Spring容器調(diào)用,并將返回值注冊(cè)為一個(gè) Bean
     */
    @Bean
    public Country country(){
        return new Country();
    }
     /**
     * 默認(rèn)情況下,Bean 的名稱是方法名。你可以通過(guò)name或value屬性指定Bean的名稱。
     */
    @Bean(name = "customService")
    public MyService myService() {
        //Bean 的名稱為 customService,而不是默認(rèn)的 myService。
        return new MyService();
    }
}

3.基于 XML 配置的注冊(cè):早期的 Spring 版本中,Bean 通常通過(guò) XML 配置文件注冊(cè)。雖然現(xiàn)在推薦使用注解,但 XML 配置仍然支持

<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">
    <!-- 注冊(cè)一個(gè) Bean -->
    <bean id="myService" class="com.example.MyService"/>
</beans>

條件化的 Bean 注冊(cè):可以結(jié)合條件注解(如 @ConditionalOnProperty、@ConditionalOnClass 等)實(shí)現(xiàn)條件化的 Bean 注冊(cè)

CommonConfig.java

@Configuration
public class CommonConfig {
    /**
     * 使用@ConditionalOnProperty 條件注入:配置文件中前綴是province,屬性名為name的值若是wfs,則聲明此Bean
     * @ConditionalOnMissingBean 當(dāng)不存在當(dāng)前類型的bean時(shí),才聲明該bean
     * @ConditionalOnClass 當(dāng)classpath下存在指定類時(shí),才聲明該bean
     */
    @ConditionalOnProperty(prefix = "province",name = "name" ,havingValue = "wfs")
    @ConditionalOnMissingBean
    @ConditionalOnClass(name = "com.wfs.config.CommonConfig")
    public Province province(@Value("${province.name}") String name,
                             @Value("${province.direction}") String direction) {
        Province province = new Province();
        province.setName(name);
        province.setDirection(direction);
        return province;
    }
}

2.3 @import注解

@Import注解用于將其他配置類或組件引入到當(dāng)前配置類中。它提供了一種模塊化的方式來(lái)組織Spring應(yīng)用的配置,避免將所有配置集中在一個(gè)類中。優(yōu)先使用@ComponentScan:如果可以通過(guò)@ComponentScan掃描到的類,盡量使用@ComponentScan而不是@Import。如下面的例子:

啟動(dòng)類

/*
1@Import 可以標(biāo)注在 @Configuration 類或 @Component 類上,用于導(dǎo)入其他配置類或組件類
2@Import 可以同時(shí)導(dǎo)入多個(gè)配置類。
3@Import 還可以導(dǎo)入實(shí)現(xiàn)了 ImportSelector 接口的類,用于動(dòng)態(tài)選擇需要導(dǎo)入的配置類或組件類
*/
@Import(com.wfs.config.CommonImportSeletor.class)//使用@Import導(dǎo)入ImportSelector
//@Import(com.wfs.config.CommonConfig.class)
@SpringBootApplication
public class SpringbootBeanRegisterApplication {
    public static void main(String[] args) {
      ApplicationContext context =  SpringApplication.run(SpringbootBeanRegisterApplication.class, args);//獲取ioc容器
      Country country = context.getBean(Country.class);//獲取bean
      System.out.println(country);
      System.out.println(context.getBean("aa"));

CommonImportSeletor.java

/**
 * @ImportSelector:導(dǎo)入選擇器
 * 作用:導(dǎo)入指定配置類
 */
public class CommonImportSeletor implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.wfs.config.CommonConfig"};
    }
}

2.4 Bean的注冊(cè)順序

  • 配置類:優(yōu)先處理 @Configuration 類。
  • 組件類:掃描并注冊(cè)帶有 @Component 及其衍生注解的類。
  • 手動(dòng)注冊(cè)的 Bean:處理 @Bean 注解定義的 Bean。

2.5 Bean的依賴注入

構(gòu)造器注入:推薦的方式,適用于強(qiáng)制依賴。

@Service
public class MyService {
    private final MyRepository repository;
    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}

Setter 注入:適用于可選依賴

@Service
public class MyService {
    private MyRepository repository;
    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

字段注入:不推薦,因?yàn)椴焕跍y(cè)試和代碼可讀性。

@Service
public class MyService {
    @Autowired
    private MyRepository repository;
}

到此這篇關(guān)于Springboot控制反轉(zhuǎn)與Bean對(duì)象的文章就介紹到這了,更多相關(guān)Springboot控制反轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中CyclicBarrier?循環(huán)屏障

    Java中CyclicBarrier?循環(huán)屏障

    這篇文章主要介紹了Java中CyclicBarrier?循環(huán)屏障,可以實(shí)現(xiàn)讓一組線程等待至某個(gè)狀態(tài)屏障點(diǎn)之后再全部同時(shí)執(zhí)行,下面文章分享CyclicBarrier循環(huán)屏障的原理,需要的小伙伴可以參考一下
    2022-05-05
  • Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor

    Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor

    這篇文章主要介紹了Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • IDEA 插件 mapper和xml互相跳轉(zhuǎn)操作

    IDEA 插件 mapper和xml互相跳轉(zhuǎn)操作

    這篇文章主要介紹了IDEA 插件 mapper和xml互相跳轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java多線程 兩階段終止模式Two-Phase Termination Patter

    Java多線程 兩階段終止模式Two-Phase Termination Patter

    這篇文章主要介紹了Java多線程 兩階段終止模式Two-Phase Termination Patter,該模式有兩個(gè)角色,分別是Terminator,終止者,負(fù)責(zé)接收終止請(qǐng)求,執(zhí)行終止處理,處理完成后再終止自己。TerminationRequester終止請(qǐng)求發(fā)出者,用來(lái)向Terminator發(fā)出終止請(qǐng)求,需要的朋友可以參考一下
    2021-10-10
  • Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟

    Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟

    本文主要介紹了Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟,首先介紹eclipse開發(fā)JavaWeb項(xiàng)目需要配置的相關(guān)環(huán)境,使用tomcat軟件在本地搭建服務(wù)器,然后再在eclipse環(huán)境下配置tomcat,感興趣的可以了解一下
    2021-08-08
  • java httpclient設(shè)置超時(shí)時(shí)間和代理的方法

    java httpclient設(shè)置超時(shí)時(shí)間和代理的方法

    這篇文章主要介紹了java httpclient設(shè)置超時(shí)時(shí)間和代理的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式

    SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式

    項(xiàng)目中,經(jīng)常需要在啟動(dòng)過(guò)程中初始化一些數(shù)據(jù),如從數(shù)據(jù)庫(kù)讀取一些配置初始化,或從數(shù)據(jù)庫(kù)讀取一些熱點(diǎn)數(shù)據(jù)到redis進(jìn)行初始化緩存,本文給大家介紹了SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作

    Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作

    這篇文章主要介紹了Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二)

    java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二)

    這篇文章主要介紹了java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評(píng)論