在Spring框架中,Bean是重要的資源,每個Bean在容器中都應該有一個對應的BeanDefinition對象,它是Spring中定義和封裝Bean配置元數據的中心描述符。BeanDefinition對象是Spring中IoC容器創建、裝配和管理Bean的核心類,掌握BeanDefinition及其相關的屬性和方法,有助於深入理解Spring框架的設計思想和核心功能。
一、獲取BeanDefinition對象
在Spring框架中,獲取BeanDefinition對象常見的方式有三種:
1、使用BeanFactory介面或ApplicationContext介面中的getBeanDefinition方法獲取指定Bean的BeanDefinition對象;
BeanDefinition bd = factory.getBeanDefinition("beanName"); //通過Bean名稱獲取BeanDefinition BeanDefinition bd = factory.getBeanDefinition(BeanClass.class); //通過Bean類型獲取BeanDefinition
2、使用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等XmlApplicationContext實現類創建Spring容器,通過BeanDefinitionReader或BeanDefinitionParser解析讀取xml中的配置信息,然後生成BeanDefinition對象;
@Bean public BeanDefinitionReader beanDefinitionReader() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory()); reader.loadBeanDefinitions(new ClassPathResource("beans.xml")); return reader; }
3、通過BeanDefinitionBuilder創建和修改BeanDefinition對象。
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.addPropertyValue("propertyName", "propertyValue"); builder.setScope(BeanDefinition.SCOPE_SINGLETON); BeanDefinition bd = builder.getBeanDefinition();
二、Bean的作用域
在Spring框架中,Bean通過Scope屬性來定義Bean的作用域,Spring框架提供了以下五種作用域:
1、singleton:單例模式,容器中只存在一個Bean實例,默認作用域;
2、prototype:原型模式,每次請求Bean時,都會創建一個新的Bean實例;
3、request:針對Web應用,每個Http請求都會創建一個新的Bean實例;
4、session:針對Web應用,每個Http Session會創建一個新的Bean實例;
5、globalSession:針對Web應用,全局Http Session會創建一個新的Bean實例。
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.setScope(BeanDefinition.SCOPE_PROTOTYPE); BeanDefinition bd = builder.getBeanDefinition();
三、Bean的聲明周期
在Spring框架中,Bean生命周期可以被分為以下七個階段:
1、實例化Bean:Spring容器根據BeanDefinition的配置信息創建一個Bean實例;
2、設置對象屬性:Spring容器根據BeanDefinition的配置信息將屬性或引用注入到Bean中;
3、調用BeanPostProcessor的postProcessBeforeInitialization()方法:BeanPostProcessor是Spring框架提供的介面,用於對Bean進行初始化前後的處理工作;
4、調用InitializingBean介面的afterPropertiesSet()方法或者在xml文件中配置init-method方法:該方法在Bean的所有屬性被設置之後調用,完成其他的初始化工作;
5、調用BeanPostProcessor的postProcessAfterInitialization()方法:如果這個Bean是SmartInitializingSingleton或者SmartLifecycle介面的實現類並且被註冊了,直接進入第七步;
6、Bean可以使用了:Bean正在工作當中;
7、調用SmartLifecycle的start()方法或SmartInitializingSingleton的afterSingletonsInstantiated()方法:如果Bean實現了SmartLifecycle介面,那麼在Spring啟動時,自動調用start()方法使Bean處於運行狀態;如果Bean實現了SmartInitializingSingleton介面,那麼在所有Bean都初始化完成後,調用afterSingletonsInstantiated()方法。
@Component public class ExampleBean implements InitializingBean, DisposableBean, SmartInitializingSingleton, SmartLifecycle { //... @Override public void afterSingletonsInstantiated() { log.info("Executing afterSingletonsInstantiated()"); } @Override public void start() { log.info("Executing start()"); } //... }
四、Bean的依賴關係
Spring框架中,Bean之間的依賴關係通常通過BeanDefinition對象中的DependsOn屬性、@Autowired註解和@Resource註解來完善。
1、DependsOn屬性:用於強制提前初始化特定Bean依賴的Bean;
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.getBeanDefinition().setDependsOn(new String[]{"dependentBean"});
2、@Autowired註解:將其他Bean作為屬性注入到當前Bean中,以創建依賴關係;
@Component public class ExampleBean { @Autowired private OtherBean otherBean; //... }
3、@Resource註解:類似@Autowired註解,用於將其他Bean作為屬性注入到當前Bean中,可以指定Bean的名稱或者類型。
@Component public class ExampleBean { @Resource(name = "otherBean") private OtherBean otherBean; //... }
五、Bean的元數據
Spring框架中,Bean元數據是指Bean的詳細描述信息,包括Bean的類名、作用域、構造參數、屬性、依賴等。Spring提供了多種方式來定義Bean元數據。
1、xml方式:通過定義xml文檔,在xml元素中聲明Bean元數據;
2、JavaConfig方式:使用JavaConfig方式定義Bean元數據,通過@Configuration註解標記JavaConfig類,使用@Bean註解定義Bean;
@Configuration public class AppConfig { @Bean public ExampleBean exampleBean(){ ExampleBean exampleBean = new ExampleBean(); exampleBean.setPropertyName("propertyValue"); return exampleBean; } }
六、Bean的後置處理器
在Spring框架中,Bean的後置處理器是指在Bean生命周期中,在Bean屬性注入、Bean初始化前後等階段對Bean進行定製化操作的處理器。Spring框架提供了如下的Bean後置處理器介面:
1、BeanPostProcessor:所有Bean後置處理器都需要實現該介面;
2、InstantiationAwareBeanPostProcessor:繼承BeanPostProcessor介面,用來在Bean實例化前後對Bean進行特殊處理,例如Bean自動裝載、AOP功能實現;
3、BeanFactoryPostProcessor:在BeanFactory容器實例化完成之後,BeanFactoryPostProcessor介面會先於其他Bean被實例化,用於對BeanFactory容器進行post-processing操作。
public class ExampleBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { //執行Bean初始化前的操作 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { //執行Bean初始化後的操作 return bean; } }
七、總結
本文詳細介紹了Spring框架中BeanDefinition的相關概念,包括獲取BeanDefinition對象、Bean的作用域、Bean的聲明周期、Bean的依賴關係、Bean的元數據和Bean的後置處理器等。Spring框架通過BeanDefinition對象的封裝和管理,實現對Bean的自動裝配、託管、管理等核心功能,使得Spring框架應用更加簡單、更加靈活、更加高效。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/157799.html