日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring初始化bean时执行某些方法完成特定的初始化操作

發(fā)布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring初始化bean时执行某些方法完成特定的初始化操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在項目中經(jīng)常會在容器啟動時,完成特定的初始化操作,如資源文件的加載等。

一 實現(xiàn)的方式有三種:

1.使用@PostConstruct注解,該注解作用于void方法上

2.在配置文件中配置init-method方法

<bean id="student" class="com.demo.spring.entity.Student" init-method="init2"><property name="name" value="景甜"></property><property name="age" value="28"></property><property name="school" ref="school"></property> </bean>

3.將類實現(xiàn)InitializingBean接口

package com.demo.spring.entity;import javax.annotation.PostConstruct;import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component;/*** @author chenyk* @date 2018年5月8日*/ @Component("student") public class Student implements InitializingBean{private String name;private int age;private School school;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public School getSchool() {return school;}public void setSchool(School school) {this.school = school;}//1.使用postconstrtct注解 @PostConstructpublic void init(){System.out.println("執(zhí)行 init方法");}//2.在xml配置文件中配置init-method方法public void init2(){System.out.println("執(zhí)行init2方法 ");}//3.實現(xiàn)InitializingBean接口public void afterPropertiesSet() throws Exception {System.out.println("執(zhí)行init3方法");}}

執(zhí)行結(jié)果:

執(zhí)行 init方法
2018-06-11 10:09:16,195 DEBUG [AbstractAutowireCapableBeanFactory.java:1671] : Invoking afterPropertiesSet() on bean with name 'student'
執(zhí)行init3方法
2018-06-11 10:09:36,459 DEBUG [AbstractAutowireCapableBeanFactory.java:1731] : Invoking init method 'init2' on bean with name 'student'
執(zhí)行init2 方法

二 實現(xiàn)原理:

由以上執(zhí)行結(jié)果可知:先執(zhí)行@PostConstruct注解的方法,然后是實現(xiàn)了InitializingBean接口的afterPropertiesSet方法,最后執(zhí)行在配置文件中配置的init-method方法。至于為什么是這個順序,可以看源碼:

在?AbstractAutowireCapableBeanFactory 類中

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {invokeAwareMethods(beanName, bean);return null;}}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {
       //調(diào)用初始化方法invokeInitMethods(beanName, wrappedBean, mbd);}
catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}

然后進(jìn)入到?invokeInitMethods 方法中?

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isDebugEnabled()) {logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {@Overridepublic Object run() throws Exception {((InitializingBean) bean).afterPropertiesSet();return null;}}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {
          //直接調(diào)用 InitializingBean 接口中的 afterPropertiesSet 方法((InitializingBean) bean).afterPropertiesSet();}}
if (mbd != null) {String initMethodName = mbd.getInitMethodName();if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {
          //進(jìn)入該方法可知通過反射的方式調(diào)用init-method方法invokeCustomInitMethod(beanName, bean, mbd);}}}

所以,初始化方法的執(zhí)行順序?afterPropertiesSet() > init-method()

博客園的第一篇文章。感覺博客園很干凈,文章排版特別是插入代碼格式看起來很舒服。就不吐槽csdn了。

轉(zhuǎn)載于:https://www.cnblogs.com/51life/p/9166009.html

總結(jié)

以上是生活随笔為你收集整理的spring初始化bean时执行某些方法完成特定的初始化操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲另类xxxx| 欧美高清日韩 | 她也啪在线视频 | 免费在线激情视频 | 午夜精品久久久久久久爽 | 毛片在线免费播放 | 香蕉久久网 | 欧美日韩卡一卡二 | 亚洲va国产天堂va久久 en | 成人小视频在线播放 | 男人天堂成人 | 亚洲天堂系列 | 日韩精品中文字幕在线播放 | 久久国产美女 | 无码国产69精品久久久久同性 | 免费人妻精品一区二区三区 | 青春草在线视频观看 | 深夜福利视频在线观看 | 欧美日韩亚洲国产一区 | 久久精品成人av | 久久久久性色av无码一区二区 | 91色拍| 第四色影音先锋 | 国产精品国产三级国产三级人妇 | 天天插天天插 | 曰批免费视频播放免费 | 日日摸夜夜添狠狠添欧美 | 久久久在线观看 | 性感美女一区 | 激情成人综合 | 美女三级视频 | 中文国产视频 | 久久受 | asian日本肉体pics | 爱啪啪影视 | 国产91清纯白嫩初高中在线观看 | 制服丝袜在线播放 | 麻豆传媒一区二区 | 国产成人精品白浆久久69 | 国产乱码精品一区二区三区忘忧草 | 麻豆视频免费入口 | 欧美久久久久久久久久久久久久 | 综合色在线视频 | 漂亮少妇高潮午夜精品 | 成人黄色av网址 | 性高潮免费视频 | 久久99免费 | 黄黄视频在线观看 | 欧美日韩中文字幕在线视频 | 午夜影院一区 | 人妻无码中文久久久久专区 | 青娱乐在线播放 | 男生和女生差差的视频 | 催眠调教后宫乱淫校园 | 男人插女人下面视频 | 国产精品乱码久久久久久久久 | 亚洲熟妇丰满大屁股熟妇 | 国产一区二区三区四区视频 | 一级少妇毛片 | 一区视频在线播放 | 天天舔天天操 | 蜜桃视频在线网站 | 亚洲美女一级片 | 极品淫少妇 | 成人小说亚洲一区二区三区 | 99热这里只有精品2 91免费版黄 | 久久午夜影视 | 国产又粗又深又猛又爽又在线观看 | 黄色高清免费 | 污污网站免费 | 福利小视频在线播放 | 国产一级久久 | 久久久久久av无码免费网站下载 | juliaann欧美二区三区 | 操大逼网站 | 欧美精品一区二区在线播放 | 国产区在线 | 自拍毛片 | 色视频综合| 国毛片| 中文字幕被公侵犯的漂亮人妻 | 瑟瑟视频免费观看 | 天天做天天爱天天爽综合网 | 欧美三级在线观看视频 | 午夜激情亚洲 | 我和公激情中文字幕 | 国产aⅴ无码片毛片一级一区2 | 国产欧美一区二区三区国产幕精品 | 免费av不卡| 国产一区二区三区四区五区美女 | 成人三级做爰av | 91网站大全 | www.777奇米影视| 色猫咪av在线 | 亚洲欧美另类中文字幕 | 国外精品视频 | 欧美日韩xxxx| 性色欲网站人妻丰满中文久久不卡 | 一区二区美女视频 |