Bean 的作用域是指Bean 在Spring 整個框架中的某種行為模式.
#例如singleton 單例作用域, 就表示Bean 在整個Spring 中只有一份, 它是全域共享的, 那麼當其他人修改了這個值之後, 那麼另一個人讀取到的就是被修改的值.
singleton: 單例作用域(預設作用域)
Bean 預設情況下是單例狀態(singleton),也就是所有⼈的使⽤的都是同⼀個對象,之前我們學單例模式的時候都知道,使用單例可以很大程度上提高性能,所以在Spring 中Bean 的作用域默認也是singleton 單例模式。
application (了解)
websocket (了解)
單例作用域(singleton) VS 全域作用域(application)
@Scope 標籤既可以修飾⽅法也可以修飾類,@Scope 有兩種設定⽅式使⽤枚舉設定:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component public class UserBeans { @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Gujiu"); user.setPassword("123456"); return user; } }#直接設定值:
#@Scope("prototype" )
@Component public class UserBeans { @Scope("prototype") @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Gujiu"); user.setPassword("123456"); return user; } }Spring 執行流程
xml 直接註冊Bean
Bean 根(掃描) 路徑
Spring 中: 透過類別註解進行掃描和組裝
Bean 組裝到需要的類別中(取操作)
所謂的⽣命週期指的是⼀個物件從誕⽣到銷毀的整個⽣命過程,我們把這個過程就叫做⼀個物件的⽣命週期。Bean 的生命週期:
实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打电话给各个装修的师傅]
执行 BeanPostProcessor 初始化前置方法 [师傅勘察环境, 指定装修方案 (前置工作)]
执行 @PostConstruct 初始化方法,依赖注入操作之后被执行 [两类装修师傅进行装修]
执行自己指定的 init-method 方法 (如果有指定的话) [两类装修师傅进行装修]
执行 BeanPostProcessor 初始化后置方法 [装修之后的清理工作]
使用 Bean [房子可以入住使用了]
销毁 Bean [卖掉房子]
BeanLifeComponent 类:
//@Component public class BeanLifeComponent implements BeanNameAware { @Override public void setBeanName(String s) { System.out.println("执行了通知"); } @PostConstruct public void postConstruct() { System.out.println("执行了 @PostConstruct"); } public void init() { System.out.println("执行了 init-method"); } @PreDestroy public void preDestroy() { System.out.println("执行了销毁方法"); } }
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"> <bean id="myComponent" class="com.demo.component.BeanLifeComponent" init-method="init" ></bean> </beans>
调用类:
public class App2 { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); BeanLifeComponent beanLifeComponent = applicationContext.getBean("myComponent", BeanLifeComponent.class); System.out.println("使用Bean"); applicationContext.destroy(); } }
运行结果展示:
以上是Java之Spring Bean作用域與生命週期的深入分析與原始碼解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!