javascript
Spring Boot-@Configuration注解
@Configuration:指明當前類是一個配置類,就是來替代spring的配置文件
@Configuration public class MyConfigFile {@Beanpublic HelloService helloService(){return new HelloService();} }
使用@Bean添加組件
@SpringBootTest class SpringBoot02ApplicationTests {@AutowiredApplicationContext ioc;@Testpublic void testHelloService(){boolean helloService = ioc.containsBean("helloService");System.out.println(helloService);}}測試:true
@Configuration注解進階內容
1.創建一個User實體類
package com.hao.springbooton.bean;/*** @author:抱著魚睡覺的喵喵* @date:2020/12/22* @description:*/ public class User {private String username;private String password;private int age;public User() {}public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +'}';} }2.編寫一個MyConfig的配置類
/*** @author:抱著魚睡覺的喵喵* @date:2020/12/22* @description:配置類*/ @Configuration public class MyConfig {@Bean("hao")public User user(){return new User("tom","123",20);}}3.在主配置文件從容器中獲取user
@SpringBootApplication public class SpringBootOnApplication {public static void main(String[] args) {ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);//判斷從容器中獲取的是否是單實例User tom = run.getBean("hao", User.class);User tom1 = run.getBean("hao",User.class);System.out.println(tom==tom1);//通過配置類調用查看兩次調用的結果MyConfig co = run.getBean(MyConfig.class);System.out.println(co);User user = co.user();User user1 = co.user();System.out.println(user==user1);} }結果:
我們編寫的MyConfig配置類也是一個組件,配置類中注入的對象也是組件,我們發現通過配置類調用完這個user方法,兩者是同一個user對象;所以無論是從另外一個組件中獲取(比如MyConfig是一個組件)組件(對象),Spring都會從容器中進行查看是否存在該組件(從一個組件中調用另外一個組件也叫做組件依賴,具體看下面)
我們可以查看@Configuration注解源碼
其中的proxyBeanMethods()方法默認值是true,這就保證了單實例
接下來我們引進組件依賴
編寫Admin類
public class Admin {private String name;private String img;public Admin() {}public Admin(String name, String img) {this.name = name;this.img = img;}@Overridepublic String toString() {return "admin{" +"name='" + name + '\'' +", img='" + img + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;} }修改User類,增加Admin屬性
public class User {private String username;private String password;private int age;private Admin admin;public Admin getAdmin() {return admin;}public void setAdmin(Admin admin) {this.admin = admin;}public User() {}public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +", admin=" + admin +'}';} }MyConfig的修改(相關說明已在注釋中表明)
/*** @author:抱著魚睡覺的喵喵* @date:2020/12/22* @description:配置類*//*** Spring 5提供了Full模式和Lite模式* 組件依賴:容器中一個組件調用另外一個組件的情況* Lite:容器中組件沒有依賴的情況:使用Lite模式能使容器快速啟動* Full:容器中的組件存在依賴的情況,使用Full模式,由于在一個組件中存在調用另外一個組件的情況,所以會查看該組件在容器中是否存在,當然也就降低了容器啟動的速度*/ @Configuration(proxyBeanMethods = true) public class MyConfig {@Bean("hao")public User user(){User tom = new User("tom", "123", 20);//hao組件依賴了admin組件tom.setAdmin(admin());return tom;}@Bean("admin")public Admin admin(){return new Admin("jerry","@the");} } @SpringBootApplication public class SpringBootOnApplication {public static void main(String[] args) {ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);MyConfig co = run.getBean(MyConfig.class);User hao = run.getBean("hao", User.class);Admin admin = run.getBean("admin", Admin.class);System.out.println(hao.getAdmin()==admin);}}此時運行結果:true
此時我把MyConfig類中的注解改為@Configuration(proxyBeanMethods = false)
@Configuration(proxyBeanMethods = false) public class MyConfig {@Bean("hao")public User user(){User tom = new User("tom", "123", 20);//hao組件依賴了admin組件tom.setAdmin(admin());return tom;}@Bean("admin")public Admin admin(){return new Admin("jerry","@the");} }繼續測試
結果:false
這說明當proxyBeanMethods = false時,Spring幫我們執行了Lite模式;
總結:假設我在配置類中,注入了兩個組件(A和B)到容器中,組件A調用了組件B
Lite(proxyBeanMethods =false)模式:程序運行時Spring不會檢查B組件是否存在,即上面舉的例子中調用之后直接new個對象。
Full(proxyBeanMethods =true)模式:程序運行時,當A調用B時,Spring會檢查容器中是否存在B組件,如果存在就從容器中拿
Lite和Full適用于的情況:當配置類中沒有出現組件依賴的情況,使用Lite模式可以提高容器的啟動速度。當配置中出現組件依賴的時候,使用Full模式最合適。
===========================================================
@Import是向容器中導入組件,需要和@Configuration注解一塊使用
總結
以上是生活随笔為你收集整理的Spring Boot-@Configuration注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot-@ImportR
- 下一篇: Spring Boot-Profile