溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么實(shí)現(xiàn)SpringBoot的底層注解

發(fā)布時(shí)間:2021-06-05 08:14:49 來源:億速云 閱讀:330 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了怎么實(shí)現(xiàn)SpringBoot的底層注解,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

一、@Configuration注解

1、基本使用

自定義配置類

/**
 * 1、@Configuration 告訴SpringBoot這是一個(gè)配置類,相當(dāng)于一個(gè)xml配置文件
 *
 * 2、配置類里面使用 @Bean 標(biāo)注在方法上 來給容器注冊(cè)組件,默認(rèn)是單實(shí)例的
 *
 * 3、配置類本身也是一個(gè)組件
 */
@Configuration(proxyBeanMethods = true)
public class MyConfig {

    @Bean
    public User user01(){
        return new User("zhangsan",23);
    }

    @Bean
    public Pet pet01(){
        return new Pet("cat");
    }
}

主程序類

/**
 * 主程序類
 * @SpringBootApplication:這是一個(gè)SpringBoot應(yīng)用
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //返回IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);

        //從容器中獲取bean
        User user = context.getBean(User.class);
        System.out.println(user);

        Pet pet = context.getBean("pet01", Pet.class);
        System.out.println(pet);

        MyConfig myConfig = context.getBean(MyConfig.class);
        System.out.println(myConfig);

        /*如果配置@Configuration(proxyBeanMethods = true),代理對(duì)象調(diào)用方法從容器中拿組件,SpringBoot總會(huì)檢查容器中是否有這個(gè)組件
        * 保持組件的單實(shí)例*/
        User user1 = myConfig.user01();
        User user2 = myConfig.user01();
        System.out.println(user1 == user2);

    }
}

打印結(jié)果:

怎么實(shí)現(xiàn)SpringBoot的底層注解

2、Full模式與Lite模式

Full模式是指proxyBeanMethods = true,開啟代理bean的方法。此時(shí)調(diào)用配置類中每一個(gè)給而容器注冊(cè)組件方法,都會(huì)從容器中找組件,保持單例模式。

  /*如果配置@Configuration(proxyBeanMethods = true),代理對(duì)象調(diào)用方法從容器中拿組件,SpringBoot總會(huì)檢查容器中是否有這個(gè)組件
        * 保持組件的單實(shí)例*/
        User user1 = myConfig.user01();
        User user2 = myConfig.user01();
        System.out.println(user1 == user2);		//true

Lite模式是指proxyBeanMethods = false,關(guān)閉代理bean的方法。容器中不會(huì)保存代理對(duì)象,每一次調(diào)用配置類里面的方法,·都會(huì)產(chǎn)生一個(gè)新的對(duì)象。這可以解決組件依賴的問題。

User組件里面有Pet組件

public class User {
    private String name;
    private Integer age;

    private Pet pet;

    public Pet getPet() {
        return pet;
    }
}

自定義的配置類中proxyBeanMethods設(shè)置為false

@Configuration(proxyBeanMethods = false)
public class MyConfig {

    @Bean
    public User user01(){
        User user = new User("zhangsan", 23);
        //User組件依賴了Pet組件
        user.setPet(pet01());
        return user;
    }

    @Bean
    public Pet pet01(){
        return new Pet("cat");
    }
}

主程序類

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
    
        User user01 = context.getBean("user01", User.class);
        Pet pet01 = context.getBean("pet01", Pet.class);
        System.out.println(user01.getPet() == pet01);		//true
        
    }
}

打印結(jié)果:

怎么實(shí)現(xiàn)SpringBoot的底層注解

  • 配置類組件之間無依賴關(guān)系Lite模式加速容器啟動(dòng)過程,減少判斷

  • 配置類組件之間有依賴關(guān)系,方法會(huì)被調(diào)用得到之前單實(shí)例組件,這時(shí)要用Full模式

二、@Import注解導(dǎo)入組件

@Import注解可以給容器中自動(dòng)創(chuàng)建出指定類型的組件,默認(rèn)組件的名字就是全類名

@Import(DBHelper.class)
@Configuration(proxyBeanMethods = false)
public class MyConfig {

}

在容器中或者這個(gè)導(dǎo)入的組件

怎么實(shí)現(xiàn)SpringBoot的底層注解

三、@Conditional注解條件裝配

滿足Conditional指定的條件的方法,則進(jìn)行組件注入

怎么實(shí)現(xiàn)SpringBoot的底層注解

怎么實(shí)現(xiàn)SpringBoot的底層注解

也可以標(biāo)注在類上,當(dāng)容器中存在指定的組件的時(shí)候,配置類中的方法才會(huì)生效

怎么實(shí)現(xiàn)SpringBoot的底層注解

四、@ImportResource注解導(dǎo)入Spring配置文件

外部配置文件

怎么實(shí)現(xiàn)SpringBoot的底層注解

導(dǎo)入外部配置文件

怎么實(shí)現(xiàn)SpringBoot的底層注解

獲取導(dǎo)入的外部組件

怎么實(shí)現(xiàn)SpringBoot的底層注解

五、@ConfigurationProperties注解配置綁定

JavaBean與配置文件中屬性進(jìn)行綁定

需要使用@ConfigurationProperties@Component兩個(gè)注解,@Component注解將組件注冊(cè)到容器中,因?yàn)橹挥性谌萜髦械慕M件,才能使用SpringBoot提供的一些強(qiáng)大的注解功能

怎么實(shí)現(xiàn)SpringBoot的底層注解

訪問請(qǐng)求獲取綁定的JavaBean

怎么實(shí)現(xiàn)SpringBoot的底層注解

還可以在配置類中使用@EnableConfigurationProperties開啟組件屬性配置功能,并把這個(gè)組件自動(dòng)注冊(cè)到容器中,這樣就不需要再使用 @Component注解

@EnableConfigurationProperties(Pet.class)
public class MyConfig {
}
//@Component
@ConfigurationProperties(prefix = "mydog")
public class Pet {
}

上述內(nèi)容就是怎么實(shí)現(xiàn)SpringBoot的底層注解,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI