您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Spring初始化Bean的使用方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Spring初始化Bean的使用方法”吧!
if (instanceWrapper == null) { //上一篇bean的加載后部分主要分析了bean的創(chuàng)建,此步驟完成之后bean已經(jīng)創(chuàng)建完成,但屬性還沒(méi)有賦值,Spring //解決循環(huán)依賴(lài)的關(guān)鍵步驟就在此步驟完成之后,bean已創(chuàng)建但還沒(méi)有屬性賦值,如下圖 instanceWrapper = createBeanInstance(beanName, mbd, args); }
如下圖,以最簡(jiǎn)單的AB循環(huán)依賴(lài)為例,A中有屬性類(lèi)B,B中又有屬性類(lèi)A,那么初始化beanA的過(guò)程如下圖.
//上圖中addSingletonFactory邏輯,只有是單例的,允許循環(huán)依賴(lài)且該bean正在創(chuàng)建中(創(chuàng)建時(shí)會(huì)記錄該屬性,創(chuàng)建完成會(huì)移除該屬性), //只有三個(gè)條件都滿(mǎn)足才會(huì)addSingletonFactory boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { //為避免后期循環(huán)依賴(lài),可以在bean初始化后屬性賦值之前將創(chuàng)建實(shí)例的ObjectFactory加入工廠 addSingletonFactory(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); }
protected void addSingletonFactory(String beanName, ObjectFactory singletonFactory) { Assert.notNull(singletonFactory, "Singleton factory must not be null"); synchronized (this.singletonObjects) { if (!this.singletonObjects.containsKey(beanName)) { //放入map中 this.singletonFactories.put(beanName, singletonFactory); //目的是檢測(cè)循環(huán)引用,移除 this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } } }
//我們熟知的AOP就是在這里將advice動(dòng)態(tài)織如bean中,若沒(méi)有則直接返回bean protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) { Object exposedObject = bean; if (bean != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp; exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName); if (exposedObject == null) { return exposedObject; } } } } return exposedObject; }
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { BeanWrapper instanceWrapper = null; if (instanceWrapper == null) { //1.創(chuàng)建bean,但還沒(méi)有屬性賦值 instanceWrapper = createBeanInstance(beanName, mbd, args); } //2.條件滿(mǎn)足的話(huà)講ObjectFactory放入map中,為了解決循環(huán)依賴(lài) addSingletonFactory(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); Object exposedObject = bean; try { //3.屬性賦值 populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { //4.調(diào)用一系列初始化方法 exposedObject = initializeBean(beanName, exposedObject, mbd); } } return exposedObject; }
//之前已經(jīng)分析了步驟1創(chuàng)建bean和步驟2添加ObjectFactory,現(xiàn)在來(lái)分析屬性賦值populateBean。 protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { //讀取配置文件,解析標(biāo)簽之后,此處的pvs已經(jīng)有值了,就是配置文件中配置的lwh sayHello PropertyValues pvs = mbd.getPropertyValues(); if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); //根據(jù)名稱(chēng)自動(dòng)注入 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } //根據(jù)類(lèi)型自動(dòng)注入 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } //屬性賦值 applyPropertyValues(beanName, mbd, bw, pvs); }
protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { //尋找bw中需要依賴(lài)注入的屬性,若是配置文件中配置了person屬性,則此處查出來(lái)的propertyNames為空 //因?yàn)榕渲梦募信渲昧薾ame為person的bean,此處查找出來(lái)的propertyNames封裝的就是person,若是將配置文 //件中autowire改為byType程序也可以正常運(yùn)行;若將配置的person的id改為其他的,則byName不能正常運(yùn)行,而 //byType可以正常運(yùn)行 String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) { if (containsBean(propertyName)) { //遞歸初始化相關(guān)的bean,此處為person Object bean = getBean(propertyName); //加到pvs屬性中 pvs.add(propertyName, bean); registerDependentBean(propertyName, beanName); } } }
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) { MutablePropertyValues mpvs = null; List<PropertyValue> original; if (pvs instanceof MutablePropertyValues) { mpvs = (MutablePropertyValues) pvs; if (mpvs.isConverted()) { try { bw.setPropertyValues(mpvs); return; } } original = mpvs.getPropertyValueList(); } else { original = Arrays.asList(pvs.getPropertyValues()); } TypeConverter converter = getCustomTypeConverter(); if (converter == null) { converter = bw; } BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter); List<PropertyValue> deepCopy = new ArrayList<PropertyValue>(original.size()); boolean resolveNecessary = false; for (PropertyValue pv : original) { if (pv.isConverted()) { deepCopy.add(pv); } else { String propertyName = pv.getName(); Object originalValue = pv.getValue(); Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue); Object convertedValue = resolvedValue; boolean convertible = bw.isWritableProperty(propertyName) && !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName); if (convertible) { convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter); } if (resolvedValue == originalValue) { if (convertible) { pv.setConvertedValue(convertedValue); } deepCopy.add(pv); } else if (convertible && originalValue instanceof TypedStringValue && !((TypedStringValue) originalValue).isDynamic() && !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) { pv.setConvertedValue(convertedValue); deepCopy.add(pv); } else { resolveNecessary = true; deepCopy.add(new PropertyValue(pv, convertedValue)); } } } if (mpvs != null && !resolveNecessary) { mpvs.setConverted(); } try { //賦值核心代碼,此步驟完成之后,bean中的屬性就被賦值了 bw.setPropertyValues(new MutablePropertyValues(deepCopy)); } }
//分析完了屬性賦值populateBean方法,然后分析一系列初始化方法 //屬性賦值 populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { //調(diào)用初始化方法 exposedObject = initializeBean(beanName, exposedObject, mbd); } protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { //1.激活A(yù)ware方法 invokeAwareMethods(beanName, bean); Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { //2.執(zhí)行BeanPostProcessor的before方法 wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } try { //3.激活用戶(hù)定義的初始化方法,包括接口InitializingBean中的初始化方法和用戶(hù)配置的init-method invokeInitMethods(beanName, wrappedBean, mbd); } if (mbd == null || !mbd.isSynthetic()) { //4.執(zhí)行BeanPostProcessor的after方法 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }
步驟1:激活A(yù)ware方法
private void invokeAwareMethods(final String beanName, final Object bean) { if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { ((BeanNameAware) bean).setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader()); } if (bean instanceof BeanFactoryAware) { //附錄1中的類(lèi)實(shí)現(xiàn)了BeanFactoryAware接口,因此會(huì)調(diào)用該方法,輸出注入容器BeanFactroy ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); } } }
步驟2:執(zhí)行BeanPostProcessor的before方法
ConfigurableBeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml")); //BeanFactory要手動(dòng)注冊(cè)BeanPostProcessor,而ApplicationContext會(huì)手動(dòng)檢測(cè) bf.addBeanPostProcessor(new MyTestBean()); bf.getBean("myTestBean", MyTestBean.class);
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName){ Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { //調(diào)用這邊會(huì)輸出我是MyTestBean的postProcessBeforeInitialization方法 result = beanProcessor.postProcessBeforeInitialization(result, beanName); if (result == null) { return result; } } return result; }
步驟3:激活用戶(hù)的初始化方法
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd){ boolean isInitializingBean = (bean instanceof InitializingBean); //刪去了部分代碼 if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { //調(diào)用InitializingBean接口中定義的初始化方法 ((InitializingBean) bean).afterPropertiesSet(); } if (mbd != null) { //配置文件init-method中配置的初始化方法 String initMethodName = mbd.getInitMethodName(); if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { //底層使用反射調(diào)用初始化方法 invokeCustomInitMethod(beanName, bean, mbd); } } }
步驟4:執(zhí)行BeanPostProcessor的after方法
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName){ Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessAfterInitialization(result, beanName); if (result == null) { return result; } } return result; }
附錄 1、根據(jù)名稱(chēng)注入例子
public class MyTestBean implements BeanFactoryAware, BeanPostProcessor, InitializingBean, DestructionAwareBeanPostProcessor{ private BeanFactory beanFactory; private Person person; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } private String testStr = "xbx"; public String getTestStr() { return testStr; } public void setTestStr(String testStr) { this.testStr = testStr; } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("注入容器BeanFactory"); this.beanFactory = beanFactory; } public void init(){ System.out.println("我是MyTestBean的初始化方法"); } public void destroy(){ System.out.println("我是MyTestBean的銷(xiāo)毀方法"); } public Object postProcessBeforeInitialization(Object bean, String beanName){ System.out.println("我是MyTestBean的postProcessBeforeInitialization方法"); return null; } public Object postProcessAfterInitialization(Object bean, String beanName){ System.out.println("我是MyTestBean的postProcessAfterInitialization方法"); return null; } public void afterPropertiesSet() throws Exception { System.out.println("我是MyTestBean的自定義的初始化方法"); } public void postProcessBeforeDestruction(Object bean, String beanName){ System.out.println("我是MyTestBean的自定義的銷(xiāo)毀方法"); } }
//配置文件中只配置了testStr屬性,并沒(méi)有配置person屬性 <bean id="myTestBean" class="com.lwh.spring.bean.MyTestBean" autowire="byName" init-method="init" destroy-method="destroy"> <property name="testStr" value="lwh sayHello"/> </bean> <bean id="person" class="com.lwh.spring.bean.Person"/>
到此,相信大家對(duì)“Spring初始化Bean的使用方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。