SpringBoot中的bean管理示例詳解
一、獲取bean
1.默認情況下,Spring項目啟動時,會把bean都創(chuàng)建好放在IOC容器中,如果想要主動獲取這些bean,可以通過如下方式:
根據name獲取bean:
object getBean (String name)
根據類型獲取bean:
<T> T getBean (Class<T> requiredType)
根據name獲取bean(帶類型轉換) :
<T> TgetBean(String name,Class<T> requiredType)
示例:
package com.itheima;
import com.itheima.controller.DeptController;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {
@Autowired
private ApplicationContext applicationContext; //IOC容器對象
//獲取bean對象
@Test
public void testGetBean() {
//根據bean的名稱獲取 //聲明一個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);
}運行結果:

上述所說的【Spring項目啟動時,會把其中的bean都創(chuàng)建好】還會受到作用域及延遲初始化影響,這里主要針對于默認的單例 非延遲加載的bean而言。
二、bean作用域
spring支持五種作用域,后三種在web環(huán)境才生效:
| 作用域 | 說明 |
|---|---|
| singleton | 容器內同名稱的bean只有一個實例(單例)(默認) |
| prototype | 每次使用該 bean時會創(chuàng)建新的實例(非單例) |
| request | 每個請求范圍內會創(chuàng)建新的實例(web環(huán)境中,了解) |
| session | 每個會話范圍內會創(chuàng)建新的實例((web環(huán)境中,了解) |
| application | 每個應用范圍內會創(chuàng)建新的實例(web環(huán)境中,了解) |
1.設置作用域
可以通過@Scope注解來進行配置作用域:
//@Lazy //延遲初始化 --延遲到第一次使用的時候
@Scope("prototype") //將作用域設置為非單例的prototype--每次調用后bean對象都不同
@RestController
@RequestMapping("/depts")
public class DeptController {
}默認singleton的bean,在容器啟動時被創(chuàng)建,可以使用@Lazy注解來延遲初始化(延遲到第一次使用時)。prototype的bean,每一次使用該bean的時候都會創(chuàng)建一個新的實例。實際開發(fā)當中,絕大部分的Bean是單例的,也就是說絕大部分Bean不需要配置scope屬性。
三、第三方bean
常見的bean管理的類
@Component @Controller @Service @Repository.但是存在第三方的bean–比如:引入的第三方依賴的bean,*示例:為了解析XML文件所添加到pom的依賴:
<!--Dom4j-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>* test中的類:
//第三方bean的管理
@Test
public void testThirdBean() throws Exception {
SAXReader saxReader = new SAXReader(); //讀取XML文件,下面邏輯是對XML文件的解析
Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
Element rootElement = document.getRootElement();
String name = rootElement.element("name").getText();
String age = rootElement.element("age").getText();
System.out.println(name + " : " + age);
}按照之前的學習,我們就需要在
SAXReader這個類上添加@Component注解,但是這個類是read-only,所以不能添加注解將其變成bean對象。
如果要管理的bean對象來自于第三方(不是自定義的),是無法用@Component 及衍生注解聲明bean的,就需要用到@Bean注解。
在啟動類上添加加一個新的方法,并且添加@Bean注解:
//聲明第三方bean
@Bean //將當前方法的返回值對象交給Ioc容器管理,成為IOC容器bean
public SAXReader saxReader() {
return new SAXReader();
}現在可以在讀取XML文件的類上添加@Autowried注解來注入這個類的bean對象:
@Autowired
private SAXReader saxReader;
//第三方bean的管理
@Test
public void testThirdBean() throws Exception {
/**
* SAXReader saxReader = new SAXReader(); //讀取XML文件,
*/
//下面邏輯是對XML文件的解析
Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
Element rootElement = document.getRootElement();
String name = rootElement.element("name").getText();
String age = rootElement.element("age").getText();
//輸出XML中的數據(解析后)
System.out.println(name + " : " + age);
}缺點:若要管理的第三方bean對象,建議對這些bean進行集中分類配置,而不是如上放在啟動類中,可以通過
@Configuration注解聲明一個配置類。
- 通過@Bean注解的name或value屬性可以聲明bean的名稱,如果不指定,默認bean的名稱就是方法名。
- 如果第三方bean需要依賴其它bean對象,直接在bean定義方法中設置形參即可,容器會根據類型自動裝配。
到此這篇關于SpringBoot中的bean管理的文章就介紹到這了,更多相關SpringBoot bean管理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux環(huán)境下java程序打包成簡單的hello world輸出jar包示例
這篇文章主要介紹了linux環(huán)境下java程序打包成簡單的hello world輸出jar包,結合簡單hello world輸出程序示例分析了Linux環(huán)境下的java可執(zhí)行jar包文件的生成相關操作技巧,需要的朋友可以參考下2019-11-11
java文件下載設置中文名稱的實例(response.addHeader)
下面小編就為大家分享一篇java文件下載設置中文名稱的實例(response.addHeader),具有很好的參考價值,希望對大家有所幫助2017-12-12

