国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

青海政府網(wǎng)站建設(shè)公司網(wǎng)站建設(shè)免費(fèi)網(wǎng)站

青海政府網(wǎng)站建設(shè)公司,網(wǎng)站建設(shè)免費(fèi)網(wǎng)站,好的網(wǎng)站建設(shè)平臺(tái),手機(jī)網(wǎng)站設(shè)計(jì)占工程比重接AnnotationConfigApplicationContext流程看實(shí)例化的beanPostProcessor-CSDN博客,以具體實(shí)例看bean生命周期的一些執(zhí)行階段 bean生命周期流程 生命周期擴(kuò)展處理說(shuō)明實(shí)例化:createBeanInstance 構(gòu)造方法, 如Autowired的構(gòu)造方法注入依賴bean 如UserSer…

接AnnotationConfigApplicationContext流程看實(shí)例化的beanPostProcessor-CSDN博客,以具體實(shí)例看bean生命周期的一些執(zhí)行階段

bean生命周期流程

生命周期擴(kuò)展處理說(shuō)明
實(shí)例化:createBeanInstance

構(gòu)造方法, 如@Autowired的構(gòu)造方法注入依賴bean

如UserService構(gòu)造方法注入AppDAO:

@Autowired
public UserService(AppDAO appDAO) {System.out.println("@Autowired appDAO:" + appDAO);this.appDAO = appDAO;
}
屬性設(shè)置:populateBean

如setter方法注入的依賴

如@Autoware的filed注入

如UserService中注入U(xiǎn)serDAO:

@Resource(name = "u")
public void setUserDAO(UserDAO userDAO) {System.out.println("setUserDAO:" + userDAO);this.userDAO = userDAO;
}
初始化:initializeBean

1.?BeanPostProcessor#postProcessBeforeInitialization

2.?@PostConstruct

3.?InitializingBean#afterPropertiesSet

initMethod

4.?BeanPostProcessor#postProcessAfterInitialization

上一步驟屬性設(shè)置完后,初始化方法前后都可以擴(kuò)展。

例如BeanPostProcessor#postProcessBeforeInitialization,直接改變了set注入的appDAO對(duì)象

@Component
public class ServiceBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// Bean 初始化前的邏輯if (beanName.equals("userService")) {UserService userService = (UserService)bean;AppDAO appDAO = new AppDAOImpl2();userService.setAppDAO(appDAO);System.out.println("postProcessBeforeInitialization:" + ":" + bean);}return bean;}
銷(xiāo)毀

1. @PreDestroy

2. DisposableBean#destroy

destroyMethod

附org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

/*** Actually create the specified bean. Pre-creation processing has already happened* at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks.* <p>Differentiates between default bean instantiation, use of a* factory method, and autowiring a constructor.* @param beanName the name of the bean* @param mbd the merged bean definition for the bean* @param args explicit arguments to use for constructor or factory method invocation* @return a new instance of the bean* @throws BeanCreationException if the bean could not be created* @see #instantiateBean* @see #instantiateUsingFactoryMethod* @see #autowireConstructor*/protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isTraceEnabled()) {logger.trace("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}if (earlySingletonExposure) {Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {if (exposedObject == bean) {exposedObject = earlySingletonReference;}else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);for (String dependentBean : dependentBeans) {if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {actualDependentBeans.add(dependentBean);}}if (!actualDependentBeans.isEmpty()) {throw new BeanCurrentlyInCreationException(beanName,"Bean with name '" + beanName + "' has been injected into other beans [" +StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +"] in its raw version as part of a circular reference, but has eventually been " +"wrapped. This means that said other beans do not use the final version of the " +"bean. This is often the result of over-eager type matching - consider using " +"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.try {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}

擴(kuò)展執(zhí)行

接上文:AnnotationConfigApplicationContext流程看實(shí)例化的beanPostProcessor-CSDN博客,來(lái)看這些BeanPostProcessor如何起作用

測(cè)試bean定義類(lèi)如下

@Service("userService")
public class UserService implements InitializingBean, DisposableBean {private String userServiceName;private UserDAO userDAO;private AppDAO appDAO;/*** field 注入*/@Autowiredprivate CommonService commonService;public UserService() {System.out.println("constructor");}/*** 類(lèi)似于 InitializingBean 的 afterPropertiesSet() 方法*/@PostConstructpublic void init() {System.out.println("PostConstruct userService");System.out.println("userDAO is not null:" + (userDAO != null));System.out.println("appDAO is not null:" + (appDAO != null));userServiceName = "selfUserService";}/*** setter注入* @param userDAO*/@Resource(name = "u")public void setUserDAO(UserDAO userDAO) {System.out.println("setUserDAO:" + userDAO);this.userDAO = userDAO;}/*** 構(gòu)造器注入* @param appDAO*/@Autowiredpublic UserService(AppDAO appDAO) {System.out.println("@Autowired appDAO:" + appDAO);this.appDAO = appDAO;}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}/*** 類(lèi)似于 DisposableBean 的 destroy() 方法*/@PreDestroypublic void preDestroy() {System.out.println("preDestroy");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet userService");}@Overridepublic void destroy() throws Exception {System.out.println("destroy userService");}public void setUserServiceName(String userServiceName) {this.userServiceName = userServiceName;}public void setAppDAO(AppDAO appDAO) {this.appDAO = appDAO;}@Overridepublic String toString() {return "UserService{" +"userServiceName='" + userServiceName + '\'' +", userDAO=" + userDAO +", appDAO=" + appDAO +", commonService=" + commonService +'}';}
}

InstantiationAwareBeanPostProcessors:SmartInstantiationAwareBeanPostProcessor

推斷構(gòu)造函數(shù),最后是AutowiredAnnotationBeanPostProcessor完成構(gòu)造函數(shù)的推斷

最后判斷有@Autowired的構(gòu)造函數(shù) 完成實(shí)例化過(guò)程

InstantiationAwareBeanPostProcessor:CommonAnnotationBeanPostProcessor

populate階段CommonAnnotationBeanPostProcessor完成setter注入

/*** setter注入* @param userDAO*/
@Resource(name = "u")
public void setUserDAO(UserDAO userDAO) {System.out.println("setUserDAO:" + userDAO);this.userDAO = userDAO;
}

org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessProperties

@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);try {metadata.inject(bean, beanName, pvs);}catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of resource dependencies failed", ex);}return pvs;}

InstantiationAwareBeanPostProcessor:AutowiredAnnotationBeanPostProcessor

populate階段AutowiredAnnotationBeanPostProcessor完成@Autorwired的filed的注入,具體可以再次閱讀:Spring5.1.3 @Autorwired注解原理重新回顧-CSDN博客

BeanPostProcessor#postProcessBeforeInitialization

initializeBean階段會(huì)執(zhí)行BeanPostProcessor的postProcessBeforeInitialization方法
執(zhí)行自定義的BeanPostProcessor

執(zhí)行CommonAnnotationBeanPostProcessor解析@PostConstruct注解

@PostConstruct
public void init() {System.out.println("PostConstruct userService");System.out.println("userDAO is not null:" + (userDAO != null));System.out.println("appDAO is not null:" + (appDAO != null));userServiceName = "selfUserService";
}

執(zhí)行InitializingBean的afterPropertiesSet方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods

protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isTraceEnabled()) {logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null && bean.getClass() != NullBean.class) {String initMethodName = mbd.getInitMethodName();if (StringUtils.hasLength(initMethodName) &&!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}}}
BeanPostProcessor#postProcessAfterInitialization

InitializingBean最后階段會(huì)執(zhí)行BeanPostProcessor的postProcessAfterInitialization方法

本例

@Component
public class ServiceBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// Bean 初始化前的邏輯if (beanName.equals("userService")) {UserService userService = (UserService)bean;AppDAO appDAO = new AppDAOImpl2();userService.setAppDAO(appDAO);System.out.println("postProcessBeforeInitialization:" + ":" + bean);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// Bean 初始化后的邏輯if (beanName.equals("userService")) {System.out.println("postProcessAfterInitialization:" + ":" + bean);}return bean;}
}

http://m.aloenet.com.cn/news/36885.html

相關(guān)文章:

  • 寧波網(wǎng)站建設(shè)設(shè)計(jì)制作百度信息流推廣平臺(tái)
  • 合作加盟廣州中小企業(yè)seo推廣運(yùn)營(yíng)
  • 蒼南網(wǎng)站設(shè)計(jì)公司百度非企渠道開(kāi)戶
  • 網(wǎng)站建設(shè)銷(xiāo)售培訓(xùn)2023b站免費(fèi)推廣入口游戲
  • 如何建立網(wǎng)站會(huì)員系統(tǒng)嗎網(wǎng)絡(luò)營(yíng)銷(xiāo)的特點(diǎn)有哪些
  • wordpress顯示錯(cuò)亂鄭州seo價(jià)格
  • 徐州網(wǎng)站制作機(jī)構(gòu)百度網(wǎng)站首頁(yè)提交入口
  • 安徽做公司網(wǎng)站哪家好國(guó)內(nèi)搜索引擎排行榜
  • 上海外貿(mào)建站推廣公司微信朋友圈廣告怎么推廣
  • 天津建設(shè)工程網(wǎng)站營(yíng)銷(xiāo)策略
  • 北京家裝設(shè)計(jì)師排名北京網(wǎng)站優(yōu)化推廣方案
  • 清溪仿做網(wǎng)站懂得網(wǎng)站推廣
  • 日本無(wú)碼做受網(wǎng)站企業(yè)seo顧問(wèn)
  • 網(wǎng)站設(shè)計(jì)報(bào)價(jià)是多少錢(qián)廣告信息發(fā)布平臺(tái)
  • 蘇州網(wǎng)站設(shè)計(jì)哪家好韓國(guó)比分預(yù)測(cè)
  • 安卓做網(wǎng)站seo網(wǎng)站關(guān)鍵詞優(yōu)化報(bào)價(jià)
  • 鄭州好的網(wǎng)站設(shè)計(jì)公司營(yíng)銷(xiāo)推廣活動(dòng)策劃方案大全
  • 如何查詢網(wǎng)站關(guān)鍵詞密度濟(jì)南seo全網(wǎng)營(yíng)銷(xiāo)
  • 廣州衛(wèi)健委疫情最新消息關(guān)鍵詞優(yōu)化的作用
  • 企業(yè)網(wǎng)站建設(shè)報(bào)價(jià)百度渠道開(kāi)戶
  • 江陰做網(wǎng)站優(yōu)化百度官網(wǎng)登錄入口手機(jī)版
  • 京東購(gòu)物商城網(wǎng)絡(luò)排名優(yōu)化軟件
  • asp.net做網(wǎng)站Dreamver百度搜圖匹配相似圖片
  • 化妝品網(wǎng)站設(shè)計(jì)報(bào)告怎么網(wǎng)上推廣自己的產(chǎn)品
  • 做好政府網(wǎng)站建設(shè)工作的通知安卓神級(jí)系統(tǒng)優(yōu)化工具
  • 模板式網(wǎng)站價(jià)格百度競(jìng)價(jià)的優(yōu)勢(shì)和劣勢(shì)
  • 給平頂山公安局做網(wǎng)站的公司前端培訓(xùn)哪個(gè)機(jī)構(gòu)靠譜
  • 天元建設(shè)集團(tuán)有限公司濟(jì)南第六建筑工程公司seo站長(zhǎng)工具查詢系統(tǒng)
  • 公司做網(wǎng)站找誰(shuí)做網(wǎng)站的公司seo推廣公司教程
  • 微信上登錄網(wǎng)站同步怎么做宣傳軟文是什么