獲取Bean
要從IOC容器當中來獲取到bean物件,需要先拿到IOC容器物件
@Autowired
private ApplicationContext applicationContext; //IOC容器物件
Spring容器中提供了一些方法,可以主動從IOC容器中獲取到bean物件,下面介紹3種常用方式:
-
根據name獲取bean
Object getBean(String name)
-
根據型別獲取bean
<T> T getBean(Class<T> requiredType)
-
根據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定義方法中設定形參即可,容器會根據型別自動裝配。