Spring配置Bean
阿新 • • 發佈:2018-11-03
1.宣告bean
- 宣告配置一個bean有三種方式
- 在 XML 中顯式配置
- 在 Java 中顯式的配置
- 隱式的bean發現機制和自動裝配
1.1在 XML 中顯式配置
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
這樣一個最簡單的bean就配置好了
- bean的id一般按駝峰式命名,但也可以不給出,它會根據類的全限定名稱自動生成一個id,com.mibloom.MyBean#0 , #0是用來區分同一個類生成不同的bean的,如果再生成一個就是#1
1.2使用註解自動化裝配bean
package com.mibloom; import org.springframework.stereotype.Component; /** * @Auther: LPKIENGE * @Date: 2018/10/29 17:33 * @Description:*/ @Component public class MyBean { private String name = "MIBLOOM"; public String getName() { return name; } public void setName(String name) { this.name = name; } }
自動裝配只適合那些自己定義的元件,第三方類庫中的元件是沒辦法自動裝配的(難道你要在原始碼上加註解?)所以只能用XML或者JavaConfig配置。
- @Component 註解 標記後該類會作為元件類被Spring發現並建立bean 。(元件(Component)是對資料和方法的簡單封裝)
- 像@Repository、@Service 、@Controller 都是由@Component構成的所以他們也具有@Component一樣的功能。為了結構分層所以使用了不同的名字。
- 使用註解建立的bean自動生成的id不會是長長的包名加類名而是按駝峰式生成的id。也可以指定一個id,如@Component("myName")。(也可以使用 javax.inject.Named @Named("name")來代替@Component("name")但他們之間有細微差別,不建議使用)
- 必須開啟元件掃描而且@Component要在掃描範圍內才會被Spring發現。
-
- 自動裝配只適合那些自己定義的元件,第三方類庫中的元件是沒辦法自動裝配的(難道你要在原始碼上加註解?)所以只能用XML或者JavaConfig配置。
1.2.1 @ComponentScan開啟元件掃描
- 類上標註了註解就要讓Spring發現,而讓Spring發現這一步就是開啟 元件掃描。
- 元件掃描預設是不開啟的,如果要開啟就要使用 @ComponentScan 或者 通過XML 配置。
- @ComponentScan 預設會掃描當前類所在包中所有類和所有子包中的類,如果類上配置了@Component就會被掃描到,並建立為bean。
- 在XML 中 配置 <context:component-scan base-package="com.mibloom"/> 掃描範圍也是mibloom包及其子包
1.2.2 @ComponentScan 掃描範圍
- @ComponentScan 沒有任何引數則會預設會掃描 當前類所在包中所有類 和 所有子包中的類
- @ComponentScan("com.mibloom") 或者 @ComponentScan(basePackages = "com.mibloom.lpk") 設定掃描指定包。
- @ComponentScan(basePackageClasses = SpringConfig.class) 設定掃描該類所在的包,這樣掃描的路徑不用字串表示比較安全。
- 檢視原始碼發現 無論是 value 還是basePackages 還是basePackageClasses都是陣列形式所以可以一次設定多個掃描路徑@ComponentScan(basePackages = {"com.mibloom.service","com.mibloom.lpk")
1.2.3 自動裝配即依賴注入
- 使用@Autowired即可自動裝配。
- @Autowired可以用在欄位 和 任何方法上包括構造器,用在方法上會為方法引數注入依賴。
- @Autowired注入時該bean必須存在,否則會拋異常org.springframework.beans.factory.BeanCreationException :Injection of autowired dependencies failed
- 可以設定 @Autowired(required = false) 這樣Spring就會嘗試著去裝配bean,如果存在則裝配,不存在設物件為null,所以required = false時有必要進行null檢查。
- 除了@Autowired 還可以使用javax.inject.Inject的 @Inject註解, 它和@Named一樣它是屬於Java EE 規範的註解,並不是Spring的註解。
1.3通過Java 程式碼裝配 Bean
- @Configuration註解將一個類宣告為Java配置類。
- JavaConfig類中應該沒有業務程式碼而僅僅只用來配置。
- JavaConfig類中方法新增@Bean既可以將該方法返回的類註冊為一個Bean。
package com.mibloom; import com.mibloom.lpk.Bloom; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Auther: LPKIENGE * @Date: 2018/11/3 10:55 * @Description: */ @Configuration public class JavaConfig { @Bean public MyBean myBean(){ return new MyBean(); } @Bean public Bloom bloom(){ Bloom bloom = new Bloom(); bloom.setName("THIS IS MY BLOOM"); return bloom; } }
- 被@Bean標註的方法 其返回的物件會被註冊為Bean, 就這麼簡單,因此可以在@Bean方法中為該物件做任何事,只要最後 return 該物件即可,如Bloom。
- 使用JavaConfig配置Bean非常方便並且可以為該物件被註冊為bean之前進行一些邏輯處理。
- @Configuration 也要被元件掃描器發現才行。
- @Configuration 也是由@Component構成的所以該配置類也會被元件發現註冊為bean。
2.異常
- 建立bean 最容易出現的異常就是 BeanCreationException ,這時應該檢查該注入的bean有沒有被元件掃描器掃描到,只在@ComponentScan 路徑下才能建立bean。