1.Bean的作用域
1.1 被修改的Bean案例
原因:Bean的作用域預設是單例模式的,也就是說所有⼈的使⽤的都是同⼀個物件!之前我們學單例模式的時候都知道,使⽤單例可以很⼤程度上提⾼性能,所以在 Spring 中Bean 的作⽤域預設也是 singleton 單例模式。
@Component public class Users { @Bean public User user1(){ User user = new User(); user.setId(1); user.setName("Java"); return user; } }
@Component public class Bean1 { @Autowired private User user; public User getUser(){ System.out.println("Bean1对象未修改name之前 : "+user); user.setName("C++"); return user; } }
@Component public class Bean2 { @Autowired private User user; public User getUser(){ return user; } }
public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); Bean1 bean1 = context.getBean("bean1",Bean1.class); System.out.println(bean1.getUser()); Bean2 bean2 = context.getBean("bean2",Bean2.class); System.out.println(bean2.getUser()); } }
1.2 為什麼使用單例模式作為預設作用域
相同資源只建立一份,節省空間
不需要過多的創建和銷毀對象,執行速度提高
1.3 作用域
作用域,一般理解為:限定程式中變數的可⽤範圍叫做作⽤域,或者說在原始碼中定義變數的某個區域就叫做作⽤域。
⽽Bea
的作⽤域是指Bean
在Spring
整個框架中的某種⾏為模式,⽐如#singleton
單例作⽤域,就表
示Bean
在整個Spring
中只有⼀份,它是全域共享的,那麼當其他⼈修改了這個值之後,那麼另⼀個
⼈讀取到的就是被修改的值。
在Spring中,bean 的作用域被稱為是行為模式,因為在Spring看來,單例模式,就是一種行為,意味著在整個Spring中bean只能存在一份。
1.4 Bean的6種作用域
singleton:單例作⽤域
-
prototype:原型作⽤域(多例作⽤域)
request:請求作⽤域
session:會話作⽤域
#application:全域作⽤域
#websocket:HTTP WebSocket 作⽤域
後四種都是SpringMVC中限定使用的,因此現階段我們只學前兩個就行。
1.5 設定作用域
回到剛才的案例,Bean2希望取得到的bean物件是未被修改的,我們就可以將單例模式修改為多例模式。
使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
##使用@Scope ("prototype")
:當執行性到組裝Bean的屬性那一步時,當掃描到有屬性注入時,會先停下類別注入,優先進行屬性注入,因為後面的方法可能會用到該屬性。 2.1 Bean的生命週期
所謂的生命週期指的是一個物件從誕生到銷毀的整個生命過程,我們把這個過程就叫做一個物件的生命週期。
Bean 的生命週期分為以下5大部分:
- #1.實例化Bean(為Bean 分配記憶體空間)
- 2.設定屬性(Bean 注入與組裝)
- #3.Bean 初始化
- 實作了各種Aware 通知的方法,如BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的介面方法,例如:Spring在初始化bean,是需要給bean 賦予id(name)。而設定beanName 成功的話,就會產生一個beadNameAware 通知;執行BeanPostProcessor 初始化前置方法(如果沒有重寫此方法,按照源碼操作);執行@PostConstruct 初始化方法,依賴注入操作之後被執行;執行自己指定的init -method 方法(如果有指定的話),是Spring中bean標籤內指定的方法;
這個初始化方法和上面一個用註解初始化的方法是兩個不同時期的產物,init是xml時代產物,@PostConstruct是註解時代產物。優先權:當梁總方法同時存在時,優先執行註解,再執行init執行 BeanPostProcessor 初始化後置方法(如果沒有重寫此方法,請依照來源碼操作)。
- 4.使用Bean
- 5.各種銷毀Bean銷毀容器的方法,如@PreDestroy、DisposableBean 介面方法、destroy-method 。
@PreDestroy和destroy-method的关系和初始化方法的两个关系差不多
优先级:@ProDestroy > 重写的DisposableBean接口方法 > destroy-method
执行流程图如下:
ps:
实例化和初始化的区别:实例化
就是 分配内存空间。初始化
,就是把我们一些参数,方法的具体实现逻辑给加载进去。
2.1.1生命周期演示
xml配置如下:
Bean
public class BeanLifeComponent implements BeanNameAware { @PostConstruct public void PostConstruct(){ System.out.println("执行@PostConstruct"); } public void init(){ System.out.println("执行bean-init-method"); } public void use(){ System.out.println("正在使用bean"); } @PreDestroy public void PreDestroy(){ System.out.println("执行@PreDestroy"); } public void setBeanName(String s){ System.out.println("执行了Aware通知"); } }
启动类
public class App2 { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class); beanLifeComponent.use(); context.destroy(); } }
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:content="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 https://www.springframework.org/schema/context/spring-context.xsd"> <content:component-scan base-package="com.beans"></content:component-scan> <bean id="1" class="com.beans.BeanLifeComponent" init-method="init"></bean> </beans>
2.1.2 为什么要先设置属性,在进行初始化
@Controller public class TestUser { @Autowired private Test test; public TestUser(){ test.sayHi(); System.out.println("TestUser->调用构造方法"); } }
如果这段代码先执行了初始化,也就是其构造方法,会用到test对象,此时还没有设置属性,test就为null,会造成空指针异常。因此必须先设置属性,在进行初始化。
以上是Java Spring中Bean的作用域及生命週期是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。