1. 程式人生 > >Spring配置Bean

Spring配置Bean

1.宣告bean

  • 宣告配置一個bean有三種方式
  1. 在 XML 中顯式配置
  2. 在 Java 中顯式的配置
  3. 隱式的bean發現機制和自動裝配

1.1在 XML 中顯式配置

  1. <?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="myBean" class="com.lpkienge.MyBean"
    /> </beans>

     這樣一個最簡單的bean就配置好了

  2. 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配置。
  1. @Component 註解 標記後該類會作為元件類被Spring發現並建立bean 。(元件(Component)是對資料和方法的簡單封裝)
  2. 像@Repository、@Service 、@Controller 都是由@Component構成的所以他們也具有@Component一樣的功能。為了結構分層所以使用了不同的名字。
  3. 使用註解建立的bean自動生成的id不會是長長的包名加類名而是按駝峰式生成的id。也可以指定一個id,如@Component("myName")。(也可以使用 javax.inject.Named    @Named("name")來代替@Component("name")但他們之間有細微差別,不建議使用)
  4. 必須開啟元件掃描而且@Component要在掃描範圍內才會被Spring發現。
    • 自動裝配只適合那些自己定義的元件,第三方類庫中的元件是沒辦法自動裝配的(難道你要在原始碼上加註解?)所以只能用XML或者JavaConfig配置。

1.2.1 @ComponentScan開啟元件掃描

  • 類上標註了註解就要讓Spring發現,而讓Spring發現這一步就是開啟 元件掃描。
  • 元件掃描預設是不開啟的,如果要開啟就要使用 @ComponentScan 或者 通過XML 配置。
  1. @ComponentScan 預設會掃描當前類所在包中所有類和所有子包中的類,如果類上配置了@Component就會被掃描到,並建立為bean。
  2. 在XML 中 配置  <context:component-scan base-package="com.mibloom"/> 掃描範圍也是mibloom包及其子包

1.2.2 @ComponentScan 掃描範圍

  1. @ComponentScan 沒有任何引數則會預設會掃描 當前類所在包中所有類  和  所有子包中的類
  2. @ComponentScan("com.mibloom") 或者 @ComponentScan(basePackages = "com.mibloom.lpk")  設定掃描指定包。
  3. @ComponentScan(basePackageClasses = SpringConfig.class) 設定掃描該類所在的包,這樣掃描的路徑不用字串表示比較安全。
  4. 檢視原始碼發現 無論是 value 還是basePackages 還是basePackageClasses都是陣列形式所以可以一次設定多個掃描路徑@ComponentScan(basePackages = {"com.mibloom.service","com.mibloom.lpk")

1.2.3 自動裝配即依賴注入

  1. 使用@Autowired即可自動裝配。
  2. @Autowired可以用在欄位 和 任何方法上包括構造器,用在方法上會為方法引數注入依賴。
  3. @Autowired注入時該bean必須存在,否則會拋異常org.springframework.beans.factory.BeanCreationException :Injection of autowired dependencies failed
  4. 可以設定 @Autowired(required = false) 這樣Spring就會嘗試著去裝配bean,如果存在則裝配,不存在設物件為null,所以required = false時有必要進行null檢查。
  5. 除了@Autowired 還可以使用javax.inject.Inject的 @Inject註解, 它和@Named一樣它是屬於Java EE 規範的註解,並不是Spring的註解。

1.3通過Java 程式碼裝配 Bean

  1.  @Configuration註解將一個類宣告為Java配置類。
  2. JavaConfig類中應該沒有業務程式碼而僅僅只用來配置。
  3. 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;
        }
    
    }
  4.  被@Bean標註的方法 其返回的物件會被註冊為Bean, 就這麼簡單,因此可以在@Bean方法中為該物件做任何事,只要最後 return 該物件即可,如Bloom。
  5. 使用JavaConfig配置Bean非常方便並且可以為該物件被註冊為bean之前進行一些邏輯處理。
  6. @Configuration 也要被元件掃描器發現才行。
  7. @Configuration 也是由@Component構成的所以該配置類也會被元件發現註冊為bean。

2.異常

  1. 建立bean 最容易出現的異常就是 BeanCreationException ,這時應該檢查該注入的bean有沒有被元件掃描器掃描到,只在@ComponentScan 路徑下才能建立bean。

3.屬性設定和依賴注入