中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

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

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

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

bean生命周期流程

生命周期擴展處理說明
實例化:createBeanInstance

構造方法, 如@Autowired的構造方法注入依賴bean

如UserService構造方法注入AppDAO:

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

如setter方法注入的依賴

如@Autoware的filed注入

如UserService中注入UserDAO:

@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

上一步驟屬性設置完后,初始化方法前后都可以擴展。

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

@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;}
銷毀

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;}

擴展執(zhí)行

接上文:AnnotationConfigApplicationContext流程看實例化的beanPostProcessor-CSDN博客,來看這些BeanPostProcessor如何起作用

測試bean定義類如下

@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");}/*** 類似于 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;}/*** 構造器注入* @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;}/*** 類似于 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

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

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

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階段會執(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最后階段會執(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://www.risenshineclean.com/news/36885.html

相關文章:

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