【Spring】Bean管理

hudad發表於2024-06-18

獲取Bean

要從IOC容器當中來獲取到bean物件,需要先拿到IOC容器物件

 @Autowired
 private ApplicationContext applicationContext; //IOC容器物件

Spring容器中提供了一些方法,可以主動從IOC容器中獲取到bean物件,下面介紹3種常用方式:

  1. 根據name獲取bean

    Object getBean(String name)
    
  2. 根據型別獲取bean

    <T> T getBean(Class<T> requiredType)
    
  3. 根據name獲取bean(帶型別轉換)

    <T> T getBean(String name, Class<T> requiredType)
    

示例程式碼

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext; //IOC容器物件

    //獲取bean物件
    @Test
    public void testGetBean(){
        //根據bean的名稱獲取
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);

        //根據bean的型別獲取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);

        //根據bean的名稱 及 型別獲取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }
}

Bean作用域

作用域 說明
singleton 容器內同名稱的bean只有一個例項(單例)(預設)
prototype 每次使用該bean時會建立新的例項(非單例)
request 每個請求範圍內會建立新的例項(web環境中,瞭解)
session 每個會話範圍內會建立新的例項(web環境中,瞭解)
application 每個應用範圍內會建立新的例項(web環境中,瞭解)

可以藉助Spring中的@Scope註解來進行配置作用域

@Bean

第三方提供的類是隻讀的。無法在第三方類上新增@Component註解或衍生註解。需要用到@Bean註解獲取第三方Bean。

在啟動類上新增@Bean標識的方法

@SpringBootApplication
public class SpringbootWebConfig2Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }

    //宣告第三方bean
    @Bean //將當前方法的返回值物件交給IOC容器管理, 成為IOC容器bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
}

說明:以上在啟動類中宣告第三方Bean的作法,不建議使用(專案中要保證啟動類的純粹性)

在配置類中定義@Bean標識的方法

如果需要定義第三方Bean時, 通常會單獨定義一個配置類

@Configuration //配置類  (在配置類當中對第三方bean進行集中的配置管理)
public class CommonConfig {

    //宣告第三方bean
    @Bean //將當前方法的返回值物件交給IOC容器管理, 成為IOC容器bean
          //透過@Bean註解的name/value屬性指定bean名稱, 如果未指定, 預設是方法名
    public SAXReader reader(DeptService deptService){
        System.out.println(deptService);
        return new SAXReader();
    }

}

在方法上加上一個@Bean註解,Spring 容器在啟動的時候,它會自動的呼叫這個方法,並將方法的返回值宣告為Spring容器當中的Bean物件。

注意事項 :

  • 透過@Bean註解的name或value屬性可以宣告bean的名稱,如果不指定,預設bean的名稱就是方法名。

  • 如果第三方bean需要依賴其它bean物件,直接在bean定義方法中設定形參即可,容器會根據型別自動裝配。

相關文章