<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
@Configuration這個註解作用就是告訴 springboot 這是一個設定類。
這個設定已經不陌生了,在之前 spring 相關的使用全註解方式時,就使用到了設定類。
在設定類裡,可以使用@Bean標記在方法上,給容器註冊元件,預設也是單範例的。
@Configuration //告訴SpringBoot這是一個設定類 == 組態檔 public class MyConfig { @Bean("user1") //給容器中新增元件。以方法名作為元件的id。返回型別就是元件型別。返回的值,就是元件在容器中的範例 public User user01(){ return new User("pingguo", 20); } @Bean("pet1") public Pet tomcatPet(){ return new Pet("tomcat"); } }
主執行類還是之前範例中的,列印出所有元件的名稱。
可以看到,有上面註冊的 2 個元件:user1、pet1。
在主執行類的 main 方法裡,加一個獲取設定類的輸出:
@SpringBootApplication(scanBasePackages = "com.pingguo") public class MainApplication { public static void main(String[] args) { // 返回IOC容器 final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); // 檢視容器裡的元件 final String[] beanDefinitionNames = run.getBeanDefinitionNames(); for (String name: beanDefinitionNames) { System.out.println(name); } // 從容器中獲取元件 MyConfig bean = run.getBean(MyConfig.class); System.out.println("設定類也是元件:" + bean); } }
執行 main 方法,
可以看到最後一個輸出,說明設定類本身也是個元件。
從springboot2.0之後,@Configuration 中多了一個屬性 proxyBeanMethods,用來代理 bean 的。
預設值是true,也就是說該設定類會被代理(CGLIB),在同一個組態檔中呼叫其它被@Bean註解標註的方法獲取物件時,springboot 總會檢查容器中是否存在這個元件。
如果容器中存在,直接取。不存在的話,才會去建立,保證單範例。
現在看下false的情況。
@Configuration(proxyBeanMethods = false) //改成 false public class MyConfig { @Bean("user1") //給容器中新增元件。以方法名作為元件的id。返回型別就是元件型別。返回的值,就是元件在容器中的範例 public User user01(){ return new User("pingguo", 20); } @Bean("pet1") public Pet tomcatPet(){ return new Pet("tomcat"); } }
在主執行程式裡多從呼叫方法獲取物件,判斷一下物件是否相等。
@SpringBootApplication(scanBasePackages = "com.pingguo") public class MainApplication { public static void main(String[] args) { // 返回IOC容器 final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); // 檢視容器裡的元件 final String[] beanDefinitionNames = run.getBeanDefinitionNames(); for (String name: beanDefinitionNames) { System.out.println(name); } // 從容器中獲取元件 MyConfig bean = run.getBean(MyConfig.class); System.out.println("設定類也是元件:" + bean); User user1 = bean.user01(); User user2 = bean.user01(); System.out.println(user1 == user2); } }
看最後的輸出,會是 false。
這裡引出 2 個名詞:Full 全模式,Lite 輕量級模式。
在該模式下 SpringBoot 每次啟動會跳過檢查容器中是否存在該元件。
那麼這個是用來解決什麼場景的問題呢?答案:元件依賴。
看下2個實體類:User、Pet。
public class User { private String name; private Integer age; private Pet pet; ... ...
固定程式碼部分:有參構造、無參構造、get和set方法、toString方法,就省去了。
public class Pet { private String name; ... ...
修改下設定類裡的方法:
@Configuration(proxyBeanMethods = true) public class MyConfig { @Bean("user1") public User user01(){ User pingguo = new User("pingguo",20); pingguo.setPet(tomcatPet()); return pingguo; } @Bean("pet1") public Pet tomcatPet(){ return new Pet("tomcat"); } }
到main方法測試一下:
// 依賴關係 User user01 = run.getBean("user1", User.class); Pet pet1 = run.getBean("pet1", Pet.class); System.out.println("依賴:" + (user01.getPet() == pet1));
這裡就是判斷當proxyBeanMethods = true的情況下,User物件的 pet,是不是容器中的 pet。
如果是,那麼結果就是true。
此時再將proxyBeanMethods = false,重新執行一下,結果會是 false:
那麼這 2 個模式分別在什麼時候用呢?
當在你的同一個Configuration設定類中,注入到容器中的 bean 範例之間有依賴關係時,建議使用 Full 全模式。
當在你的同一個Configuration設定類中,注入到容器中的 bean 範例之間沒有依賴關係時,建議使用 Lite 輕量級模式,以提高 springboot 的啟動速度和效能。
以上就是SpringBoot2底層註解@Configuration設定類詳解的詳細內容,更多關於SpringBoot2註解@Configuration的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45