<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
原因: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()); } }
作用域,一般理解為:限定程式中變數的可⽤範圍叫做作⽤域,或者說在原始碼中定義變數的某個區域就叫做作⽤域。
⽽Bea
的作⽤域是指Bean
在 Spring
整個框架中的某種⾏為模式,⽐如singleton
單例作⽤域,就表
示Bean
在整個Spring
中只有⼀份,它是全域性共用的,那麼當其他⼈修改了這個值之後,那麼另⼀個
⼈讀取到的就是被修改的值。
在Spring中,bean 的作用域被稱為是行為模式,因為在Spring看來,單例模式,就是一種行為,意味著在整個Spring中bean只能存在一份。
後四種都是SpringMVC中限定使用的,因此現階段我們只學前兩個就行。
回到剛才的案例,Bean2希望獲取到的bean物件是未被修改的,我們就可以將單例模式修改為多例模式。
使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
使用@Scope("prototype")
ps
:當執行性到裝配Bean的屬性那一步時,當掃描到有屬性注入時,會先停下類注入,優先進行屬性注入,因為後面的方法可能會用到該屬性。
所謂的生命週期指的是一個物件從誕生到銷燬的整個生命過程,我們把這個過程就叫做一個物件的生命週期。
Bean 的生命週期分為以下5大部分:
實現了各種 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的介面方法,例如:Spring在初始化 bean,是需要給 bean 賦予 id(name)。而設定 beanName 成功的話,就會生成一個 beadNameAware 通知;執行 BeanPostProcessor 初始化前置方法(如果沒有重寫此方法,按照原始碼操作);執行 @PostConstruct 初始化方法,依賴注入操作之後被 執行;執行自己指定的 init-method 方法(如果有指定的話),是Spring中bean標籤內指定的方法;
這個初始化方法和上面一個用註解初始化的方法是兩個不同時期的產物,init是xml時代產物,@PostConstruct是註解時代產物。優先順序:當樑總方法同時存在時,優先執行註解,再執行init執行 BeanPostProcessor 初始化後置方法(如果沒有重寫此方法,按照原始碼操作)。
@PreDestroy和destroy-method的關係和初始化方法的兩個關係差不多
優先順序:@ProDestroy > 重寫的DisposableBean介面方法 > destroy-method
執行流程圖如下:
ps:
範例化和初始化的區別:範例化
就是 分配記憶體空間。初始化
,就是把我們一些引數,方法的具體實現邏輯給載入進去。
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>
@Controller public class TestUser { @Autowired private Test test; public TestUser(){ test.sayHi(); System.out.println("TestUser->呼叫構造方法"); } }
如果這段程式碼先執行了初始化,也就是其構造方法,會用到test物件,此時還沒有設定屬性,test就為null,會造成空指標異常。因此必須先設定屬性,在進行初始化。
到此這篇關於Java Spring中Bean的作用域及生命週期的文章就介紹到這了,更多相關Java Spring Bean 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45