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

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

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

1 控制反轉(zhuǎn)

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

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

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

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

2 Ioc容器對Bean的管理

2.1 什么是Bean對象?

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

2.2 Bean的注冊過程

2.2.1 掃描Bean

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

2.2.2 定義Bean

使用@Component及其派生注解:Spring支持通過@ComponentScan自動掃描并注冊Bean。常用的注解包括:

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

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

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

3.基于 XML 配置的注冊:早期的 Spring 版本中,Bean 通常通過 XML 配置文件注冊。雖然現(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">
    <!-- 注冊一個 Bean -->
    <bean id="myService" class="com.example.MyService"/>
</beans>

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

CommonConfig.java

@Configuration
public class CommonConfig {
    /**
     * 使用@ConditionalOnProperty 條件注入:配置文件中前綴是province,屬性名為name的值若是wfs,則聲明此Bean
     * @ConditionalOnMissingBean 當(dāng)不存在當(dāng)前類型的bean時,才聲明該bean
     * @ConditionalOnClass 當(dāng)classpath下存在指定類時,才聲明該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)前配置類中。它提供了一種模塊化的方式來組織Spring應(yīng)用的配置,避免將所有配置集中在一個類中。優(yōu)先使用@ComponentScan:如果可以通過@ComponentScan掃描到的類,盡量使用@ComponentScan而不是@Import。如下面的例子:

啟動類

/*
1@Import 可以標(biāo)注在 @Configuration 類或 @Component 類上,用于導(dǎo)入其他配置類或組件類
2@Import 可以同時導(dǎo)入多個配置類。
3@Import 還可以導(dǎo)入實現(xiàn)了 ImportSelector 接口的類,用于動態(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的注冊順序

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

2.5 Bean的依賴注入

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

@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;
    }
}

字段注入:不推薦,因為不利于測試和代碼可讀性。

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

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

相關(guān)文章

  • 詳解Java的引用類型及使用場景

    詳解Java的引用類型及使用場景

    這篇文章主要介紹了詳解Java的引用類型及使用場景,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • mybatis 為什么千萬不要使用 where 1=1

    mybatis 為什么千萬不要使用 where 1=1

    這篇文章主要介紹了mybatis 為什么千萬不要使用 where 1=1,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 如何實現(xiàn)Java的ArrayList經(jīng)典實體類

    如何實現(xiàn)Java的ArrayList經(jīng)典實體類

    ArrayList是Java集合框架中一個經(jīng)典的實現(xiàn)類。他比起常用的數(shù)組而言,明顯的優(yōu)點在于,可以隨意的添加和刪除元素而不需考慮數(shù)組的大小。下面跟著小編一起來看下吧
    2017-02-02
  • java LeetCode題解KMP算法示例

    java LeetCode題解KMP算法示例

    這篇文章主要為大家介紹了java LeetCode題解KMP算法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)跳表

    Java數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)跳表

    今天帶大家來學(xué)習(xí)Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,文中對用Java實現(xiàn)跳表作了非常詳細(xì)的圖文解說及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Spring Cloud Stream與Kafka集成步驟(項目實踐)

    Spring Cloud Stream與Kafka集成步驟(項目實踐)

    Spring Cloud Stream是一個用于構(gòu)建消息驅(qū)動微服務(wù)的框架,它是基于Spring Boot和Spring Integration創(chuàng)建的,旨在簡化與消息中間件的集成工作,本教程介紹了如何結(jié)合Spring Cloud Stream框架和Apache Kafka消息代理,創(chuàng)建一個集成示例應(yīng)用,感興趣的朋友一起看看吧
    2025-08-08
  • java如何將控制臺輸出日志寫入到指定文件中

    java如何將控制臺輸出日志寫入到指定文件中

    這篇文章主要介紹了java如何將控制臺輸出日志寫入到指定文件中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解Spring AOP的實現(xiàn)方式

    詳解Spring AOP的實現(xiàn)方式

    AOP是一種思想,是對某一類事情的集中處理,切面就是指某一類特定的問題,所以AOP可以理解為面向特定方法編程,這篇文章主要介紹了Spring AOP的實現(xiàn)方式,需要的朋友可以參考下
    2024-02-02
  • Java畢業(yè)設(shè)計實戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實現(xiàn)

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+Easyui+maven+mysql實現(xiàn)一個養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-03-03
  • SpringMVC中的攔截器詳解及代碼示例

    SpringMVC中的攔截器詳解及代碼示例

    這篇文章主要介紹了SpringMVC中的攔截器詳解及代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02

最新評論

仙游县| 武宣县| 安塞县| 泽州县| 军事| 建德市| 山西省| 汶上县| 武城县| 广安市| 睢宁县| 沙洋县| 武陟县| 北宁市| 米脂县| 蒙阴县| 五寨县| 宁远县| 壶关县| 邻水| 府谷县| 绥德县| 广昌县| 昭觉县| 平南县| 岑巩县| 札达县| 光泽县| 鹿邑县| 灵宝市| 瓦房店市| 房产| 蓝田县| 静海县| 拉萨市| 德昌县| 涞源县| 集贤县| 山阴县| 无极县| 策勒县|