wordpress如何上傳超過2m合肥seo網(wǎng)站排名
文章目錄
- 簡介
- 源碼分析
- 示例代碼
- 示例一:擴展點的執(zhí)行順序
- 運行示例一
- 示例二:獲取配置文件值
- 配置文件application.properties內(nèi)容
- 定義工具類ConfigUtil
- controller測試調(diào)用
- 運行示例二
- 示例三:實現(xiàn)ResourceLoaderAware讀取文件
- ExtendResourceLoaderAware 文件內(nèi)容
- token.json 文件
- controller測試代碼
- 運行示例三
簡介
spring容器中Bean的生命周期內(nèi)所有可擴展的點的調(diào)用順序擴展接口 | 實現(xiàn)接口 |
---|---|
ApplicationContextlnitializer | initialize |
AbstractApplicationContext | refreshe |
BeanDefinitionRegistryPostProcessor | postProcessBeanDefinitionRegistry |
BeanDefinitionRegistryPostProcessor | postProcessBeanFactory |
BeanFactoryPostProcessor | postProcessBeanFactory |
instantiationAwareBeanPostProcessor | postProcessBeforelnstantiation |
SmartlnstantiationAwareBeanPostProcessor | determineCandidateConstructors |
MergedBeanDefinitionPostProcessor | postProcessMergedBeanDefinition |
InstantiationAwareBeanPostProcessor | postProcessAfterlnstantiation |
SmartInstantiationAwareBeanPostProcessor | getEarlyBeanReference |
BeanNameAware | setBeanName |
BeanFactoryAware | postProcessPropertyValues |
ApplicationContextAwareProcessor | invokeAwarelnterfaces |
InstantiationAwareBeanPostProcessor | postProcessBeforelnstantiation |
@PostConstruct | |
InitializingBean | afterPropertiesSet |
FactoryBean | getobject |
SmartlnitializingSingleton | afterSingletonslnstantiated |
CommandLineRunner | run |
DisposableBean | destroy |
- EnvironmentAware
- EmbeddedValueResolverAware
- ResourceLoaderAware
- ApplicationEventPublisherAware
- MessageSourceAware
- ApplicationStartupAware
- ApplicationContextAware
這些內(nèi)部擴展點觸發(fā)的時機在bean實例化之后,初始化之前。
1、EnvironmentAware
:凡注冊到Spring容器內(nèi)的bean,實現(xiàn)了EnvironmentAware接口重寫setEnvironment方法后,在工程啟動時可以獲得application.properties的配置文件配置的屬性值。
2、EmbeddedValueResolverAware
:用于獲取StringValueResolver的一個擴展類, StringValueResolver用于獲取基于String類型的properties的變量
3、ResourceLoaderAware
:用于獲取ResourceLoader的一個擴展類,ResourceLoader可以用于獲取classpath內(nèi)所有的資源對象,可以擴展此類來拿到ResourceLoader對象。
4、ApplicationEventPublisherAware
:用于獲取ApplicationEventPublisher的一個擴展類,ApplicationEventPublisher可以用來發(fā)布事件,結(jié)合ApplicationListener來共同使用
5、MessageSourceAware
:用于獲取MessageSource的一個擴展類,MessageSource主要用來做國際化
6、ApplicationStartupAware
:要開始收集定制的StartupStep,組件可以實現(xiàn)ApplicationStartupAware接口直接獲得ApplicationStartup實例或者在注入點請求ApplicationStartup類型。
7、ApplicationContextAware
:可以用來獲取ApplicationContext的一個擴展類,也就是spring上下文管理器,可以手動的獲取任何在spring上下文注冊的bean
源碼分析
從下列源碼的invokeAwareInterfaces
方法可知,ApplicationContextAwareProcessor
關聯(lián)了大部分Spring內(nèi)置Aware接口,它們的執(zhí)行順序如
下源碼碼所示從上到下,最開始是EnvironmentAware,最后是ApplicationContextAware
package org.springframework.context.support;class ApplicationContextAwareProcessor implements BeanPostProcessor {private final ConfigurableApplicationContext applicationContext;private final StringValueResolver embeddedValueResolver;/*** Create a new ApplicationContextAwareProcessor for the given context.*/public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {this.applicationContext = applicationContext;this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());}@Override@Nullablepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||bean instanceof ApplicationStartupAware)) {return bean;}AccessControlContext acc = null;if (System.getSecurityManager() != null) {acc = this.applicationContext.getBeanFactory().getAccessControlContext();}if (acc != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareInterfaces(bean);return null;}, acc);}else {invokeAwareInterfaces(bean);}return bean;}private void invokeAwareInterfaces(Object bean) {if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationStartupAware) {((ApplicationStartupAware) bean).setApplicationStartup(this.applicationContext.getApplicationStartup());}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}
}
示例代碼
示例一:擴展點的執(zhí)行順序
示例一展示的是7個內(nèi)部擴展點所執(zhí)行的順序
@Slf4j
@Configuration
public class ExtendInvokeAware implements EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware,ApplicationEventPublisherAware, MessageSourceAware, ApplicationStartupAware, ApplicationContextAware, BeanNameAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("setApplicationContext--Extend--run {}",applicationContext);}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {log.info("setApplicationEventPublisher--Extend--run {}",applicationEventPublisher);}@Overridepublic void setApplicationStartup(ApplicationStartup applicationStartup) {log.info("setApplicationStartup--Extend--run {}",applicationStartup);}@Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) {log.info("setEmbeddedValueResolver--Extend--run {}",resolver);}@Overridepublic void setEnvironment(Environment environment) {log.info("setEnvironment--Extend--run {}",environment);}@Overridepublic void setMessageSource(MessageSource messageSource) {log.info("setMessageSource--Extend--run {}",messageSource);}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {log.info("setResourceLoader--Extend--run {}",resourceLoader);}@Overridepublic void setBeanName(String name) {log.info("setBeanName--Extend--run {}",name);}
}
運行示例一
示例二:獲取配置文件值
展示如何利用實現(xiàn)EmbeddedValueResolverAware來獲取配置文件的屬性值
配置文件application.properties內(nèi)容
db.user=navicat
db.password=navicat
db.driverClass=com.mysql.jdbc.Driver
定義工具類ConfigUtil
該工具類功能為傳入的key獲取對應value
@Component
public class ConfigUtil implements EmbeddedValueResolverAware {private StringValueResolver resolver;@Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) {this.resolver = resolver;}/*** 獲取屬性,直接傳入屬性名稱即可* @param key* @return*/public String getPropertiesValue(String key) {StringBuilder name = new StringBuilder("${").append(key).append("}");return resolver.resolveStringValue(name.toString());}}
controller測試調(diào)用
@GetMapping("/testConfig")
public void testConfig() {String s = configUtil.getPropertiesValue("db.user");System.out.println(s);
}
運行示例二
示例三:實現(xiàn)ResourceLoaderAware讀取文件
ExtendResourceLoaderAware 文件內(nèi)容
實現(xiàn)ResourceLoaderAware 接口,并讀取文件內(nèi)容進行打印
@Slf4j
@Configuration
public class ExtendResourceLoaderAware implements ResourceLoaderAware {private ResourceLoader resourceLoader;@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;log.info("ApplicationContextAware--Extend--run {}",resourceLoader);}public void showResourceData() throws IOException{//This line will be changed for all versions of other examplesResource banner = resourceLoader.getResource("file:d:/token.json");InputStream in = banner.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));while (true) {String line = reader.readLine();if (line == null)break;System.out.println(line);}reader.close();}
}
token.json 文件
{"name":"張三"}
controller測試代碼
@Autowired
ApplicationContext context;@SuppressWarnings("resource")
@GetMapping("/testResource")
public void testResource() throws Exception{ExtendResourceLoaderAware extendResourceLoaderAware = (ExtendResourceLoaderAware) context.getBean("extendResourceLoaderAware");extendResourceLoaderAware.showResourceData();
}