全球今头条!【Spring源码】- 02 Spring IoC容器启动之refresh方法

register

AnnotationConfigApplicationContext构造方法中三个方法中第一个方法上面分析过了,现在我们来看下第二个方法:register(componentClasses)

之前使用XML方式:new ClassPathXmlApplicationContext("classpath:spring.xml");,构造方法中需要指定xml配置文件路径,然后就可以解析xml文件中等配置进行IoC启动初始化。同理,使用注解方式也需要给Context指定一个起始配置源头,使用配置类代替xml配置文件,然后根据这个起始配置类一步步的解析下去。

@Configuration@ComponentScan(basePackageClasses = {TestConfig.class})@Import(TestService03.class)public class TestConfig { @Bean public TestService01 testService01(){  return new TestService01(); }}

通过这个配置类,Spring就可以解析@ComponentScan@Import@Bean等这些注解,实现Bean注入到IoC容器中。@Configuration注解定义的配置类就相当于之前xml配置文件,不过由于现在Spring主流都推荐注解方式,xml方案使用的概率会越来越低。


(资料图片)

跟踪register(componentClasses)方法,核心逻辑在:AnnotatedBeanDefinitionReader#doRegisterBean

private  void doRegisterBean(Class beanClass, @Nullable String name,   @Nullable Class[] qualifiers, @Nullable Supplier supplier,   @Nullable BeanDefinitionCustomizer[] customizers) {  //先把此实体类型转换为一个BeanDefinition  AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);  /**   * abd.getMetadata()元数据包括注解信息、是否内部类、类Class基本信息等等   * 此处由conditionEvaluator#shouldSkip去过滤,此Class是否是配置类   * 大体逻辑为:必须有@Configuration修饰,然后解析一些Condition注解,看是否排除~   */  if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {   return;  }  abd.setInstanceSupplier(supplier);  // 解析Scope  ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);  abd.setScope(scopeMetadata.getScopeName());  // 得到Bean的名称 一般为首字母小写(此处为AnnotationBeanNameGenerator)  String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));  // 设定一些注解默认值,如lazy、Primary等等  AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);  if (qualifiers != null) {// 解析qualifiers,若有此注解  则primary都成为true了   for (Class qualifier : qualifiers) {    if (Primary.class == qualifier) {     abd.setPrimary(true);    }    else if (Lazy.class == qualifier) {     abd.setLazyInit(true);    }    else {     abd.addQualifier(new AutowireCandidateQualifier(qualifier));    }   }  }  if (customizers != null) {// 自定义定制信息(一般都不需要)   for (BeanDefinitionCustomizer customizer : customizers) {    customizer.customize(abd);   }  }  // 下面解析Scope是否需要代理,最后把这个Bean注册进去  BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);  definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);  BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}

就是将传入的配置类解析成解析成BeanDefinition,注册到IoC容器中,后续ConfigurationClassPostProcessor这个BeanFactory后置处理器在IoC开始真正初始化时,可以获取到这些配置类的BeanDefinition集合,启动解析。

refresh

前面分析了AnnotationConfigApplicationContext构造方法中前两个,这两个方法基本都是IoC启动的前戏:为IoC容器的启动做热身准备;真正的IoC容器启动初始化流程是在refresh()方法中,这是了解IoC容器启动流程最关键、核心的一个方法。

refresh方法定义在AbstractApplicationContext,采用模板模式,定义好IoC启动的流程以及每个步骤的作用,并提供基础实现,其它子类可以重写进行扩展。

public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) {  //Context进行刷新前的准备工作  prepareRefresh();  // 创建并初始化 BeanFactory,这步会将BeanDefinition载入到BeanFactory中  ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  /**  * 填充BeanFactory功能  * 上面获取获取的 BeanFactory其实还不能投入生产,因为还少配置了一些东西,比如 context的 ClassLoader 和 后置处理器等等。  */  prepareBeanFactory(beanFactory);  try {   /**   * 默认空实现,留给子类扩展使用   * 可以参照:AbstractRefreshableWebApplicationContext#postProcessBeanFactory()   */   postProcessBeanFactory(beanFactory);   /**   * 调用BeanFactory后置处理器(包括BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor)   */   invokeBeanFactoryPostProcessors(beanFactory);   registerBeanPostProcessors(beanFactory);   //初始化消息源   initMessageSource();   //初始化应用上下文事件广播器   initApplicationEventMulticaster();   //初始化其它特殊的Bean,由具体子类实现   onRefresh();   //注册事件监听器   registerListeners();   //初始化所有单实例Bean,使用懒加载模式的Bean除外   finishBeanFactoryInitialization(beanFactory);   //完成刷新并发布容器刷新事件   finishRefresh();  }  catch (BeansException ex) {   ...//省略  }  finally {   resetCommonCaches();  } }}

下面就来分析下每个方法作用,以了解IoC容器的启动流程。

prepareRefresh

prepareRefresh从方法名称可以看出,该方法主要在refresh执行前进行一些简单的准备工作,如设置Context的启动时间、状态,以及系统属性相关扩展。

/**  * 初始化上下文环境,对系统的环境变量或者系统属性进行准备和校验,如环境变量中必须设置某个值才能运行,否则不能运行,这个时候可以在这里加这个校验,重写initPropertySources方法就好了  *  * 该方法主要是做一些准备工作,如:  *  1、设置 context 启动时间  *  2、设置 context 的当前状态  *  3、初始化 context environment 中占位符  *  4、对属性进行必要的验证  */ protected void prepareRefresh() {  //设置启动时间  this.startupDate = System.currentTimeMillis();  //设置context当前状态  this.closed.set(false);//标志context状态:未关闭  this.active.set(true);//标志context状态:活跃中  /**   * 初始化context environment(上下文环境)中属性源信息,默认这里是空实现,什么都没做,这里主要提供给子类扩展,采用模板设计模式   * 比如非web环境下,context environment是StandardEnvironment类型,只会在创建时初始化两类属性源:systemEnvironment(系统环境变量)   * 和systemProperties(应用环境变量),通过@PropertySource注解等方式配置这时是还没有加载的   *   *   * 该方法主要有两个常见扩展:   *  1、可以在该类中扩展PropertySource来源,如:getEnvironment().getPropertySources().addXXX(PropertySource ps),可以参见GenericWebApplicationContext#initPropertySources()   *  2、可以在方法中添加必要属性验证,一些属性对于应用来说是必要的,缺失则会影响系统的正常逻辑,   *   如:getEnvironment().setRequiredProperties("DB_IP"),下一步就会从context environment上验证是否存在该属性,如果没有则会抛出异常并退出Spring应用   */  initPropertySources();  /**   * 对属性必要性进行校验,逻辑参见:AbstractPropertyResolver#validateRequiredProperties   */  getEnvironment().validateRequiredProperties();  //早期事件监听器集合如果为空,就新建一个;如果不为空,就先清空事件监听器集合,然后将早期事件监听器整体放入事件监听器集合。  if (this.earlyApplicationListeners == null) {   //默认情况下,earlyApplicationListeners为null   this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);  }  else {   this.applicationListeners.clear();   this.applicationListeners.addAll(this.earlyApplicationListeners);  }  //保存容器中的一些早期事件,待事件派发器multicaster初始化完成后进行事件发布  this.earlyApplicationEvents = new LinkedHashSet<>();}

这里主要注意下initPropertySources()getEnvironment().validateRequiredProperties()这两句代码。PropertySourceSpring中代表一组变量,即类似对应于一个配置文件,比如@PropertySource("test01.properties")这个常用的注解就是将配置文件解析成一个PropertySource对象。

initPropertySources()方法主要用于扩展配置来源,比如可以从网络、物理文件、数据库等加载配置信息。StandardEnvironment在创建时,会自动将系统变量System.getProperties()和应用变量System.getenv()加载进来,所以initPropertySources默认只提供的是空实现,主要用于子类扩展使用。

initPropertySources方法主要有两个常见扩展场景:

1、可以在该类中扩展PropertySource来源,如:getEnvironment().getPropertySources().addXXX(PropertySource ps),可以参见GenericWebApplicationContext#initPropertySources()2、可以在方法中添加必要属性验证,一些属性对于应用来说是必要的,缺失则会影响系统的正常逻辑,如:getEnvironment().setRequiredProperties("DB_IP"),下一步就会从context environment上验证是否存在该属性,如果没有则会抛出异常并退出Spring应用

getEnvironment().validateRequiredProperties()这句主要是对setRequiredProperties()方法设置的属性进行必要性检查,如果某个必要属性环境中不存在,则抛出异常退出应用。

obtainFreshBeanFactory

BeanFactory才是Spring中基本的IoC容器,ApplicationContext其实内部包装了一个BeanFactory,并对其进行了增强,使其更智能、更好用。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();这句主要意思是:通知Context,我要开始使用IoC容器进行初始化工作了,请提供给我一个BeanFactory容器。这个方法比较简单,基本没有需要扩展的,就不再仔细研究。

prepareBeanFactory

上面获取获取的BeanFactory容器其实还不能投入生产,因为还缺少一些配置信息,这里主要向BeanFactory填充一些必要的配置。

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 设置beanFactory的classLoader beanFactory.setBeanClassLoader(getClassLoader()); // 设置beanFactory的表达式语言处理器,Spring3开始增加了对语言表达式的支持,默认可以使用#{bean.xxx}的形式来调用相关属性值 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); // 为beanFactory增加一个默认的propertyEditor beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); // 添加一个ApplicationContextAwareProcessor类型的Bean后置处理器,该后置处理器用于处理*Aware接口的依赖注入 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); /** * 自动装配时如下接口中setter方法的依赖注入会被忽略 * 如:EnvironmentAware#setEnvironment()该setter不能用于自动装配时依赖注入方法, * 因为这些*Aware接口统一采用ApplicationContextAwareProcessor这个Bean后置处理器进行依赖注入 */ beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); /** * 设置几个自动装配的特殊规则 * DefaultListableBeanFactory#findAutowireCandidates(DependencyDescriptor ds)在查找依赖注入值时: *  1、首先会从resolvableDependencies容器中查找,如果有直接返回找到的bean进行依赖注入; *  2、如果没有,再从IoC容器中查找 * 所以,resolvableDependencies容器可以看成对常规IoC的一种扩充 */ beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); /** * 添加一个ApplicationListenerDetector类型的Bean后置处理器,将类型是ApplicationListener的bean添加到事件广播器,以便触发事件时被调用 */ beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); /** * 增加对AspectJ的支持 * 检查容器中是否包含名称为loadTimeWeaver的bean,实际上是增加Aspectj的支持 *     AspectJ采用编译期织入、类加载期织入两种方式进行切面的织入 *     类加载期织入简称为LTW(Load Time Weaving),通过特殊的类加载器来代理JVM默认的类加载器实现 */ if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {  // 添加BEAN后置处理器:LoadTimeWeaverAwareProcessor  // 在BEAN初始化之前检查BEAN是否实现了LoadTimeWeaverAware接口,  // 如果是,则进行加载时织入,即静态代理。  beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));  beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } // 注册默认的系统环境bean    // 这样应用程序中通过:getBean("environment")、getBean("systemProperties")、getBean("systemEnvironment") if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {  beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {  beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {  beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); }}

上面逻辑大致可以总结:

BeanFactory设置ClassLoaderEL表达式解析器等;添加一个BeanPostProcessorApplicationContextAwareProcessor,这个主要完成对*Aware接口功能支持,实现的核心逻辑见下:判断是否实现了XXXAware接口,如果实现则调用对应的setter方法注入依赖值。
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 ApplicationContextAware) {  ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); }}
ignoreDependencyInterface方法设置一些忽略接口:自动装配时如遇到忽略接口中setter方法的依赖注入会被忽略,因为这些*Aware接口统一采用ApplicationContextAwareProcessor这个后置处理器进行依赖注入。registerResolvableDependency方法设置一些特殊的内置对象,DefaultListableBeanFactory#findAutowireCandidates(DependencyDescriptor ds)在查找依赖注入值时:a、首先会从resolvableDependencies容器中查找,如果有直接返回找到的bean进行依赖注入;b、如果没有,再从IoC容器中查找。因此,resolvableDependencies容器可以看出是对IoC容器的一种扩充,该容器中的对象是没有经过Spring一系列容器创建流程,而是直接new方式创建。再添加一个Bean后置处理器:ApplicationListenerDetector,将系统中实现ApplicationListener接口的对象都统一存储到Set> applicationListeners中,采用了典型的事件监听/发布模式;LTW功能判断,LTW全称LoadTimeWeaver,即:加载时织入。AOPOOP一样,是一种编程思想,按照织入时机可以分为三类:编译时织入、类加载时织入和运行时织入。AspectJ实现就是编译时织入,采用的是一种特殊的编译器;Spring AOP采用的动态代理实现(jdk动态代理、cglib动态代理),这是一种运行时织入,缺点就是必须纳入IoC管理的Bean才能被代理;而LTW是类加载时织入,借助于JVM提供的Instrumentation技术,在JDK加载类时织入增强逻辑。

Instrumentation是在JVM加载Class时进行代码织入,对现有应用没有任何的侵入,APM Agent开发中就比较常用该技术。

注册三个环境变量相关Bean到容器中,这样应用中可以依赖注入到程序中进行使用;beanFactory.registerSingleton方式把对象存储到singletonObjects集合中,它类似于一个缓存,从IoC获取Bean时,首先会通过getSingleton方法从缓存拿,如果缓存拿不到再去获取对应的BeanDefinition进行实例化,然后实例化对象放到singletonObjects集合中。

postProcessBeanFactory

postProcessBeanFactory(beanFactory)默认是空实现,主要是留给子类进行扩展,从名称上看该方法主要用于添加BeanFactoryPostProcessorAnnotationConfigApplicationContext已经在前面注册了一个ConfigurationClassPostProcessor,主要用于完成对Spring配置类的处理,其它子类可以重新这个方法增加其它BeanFactoryPostProcessor对象,实现功能扩充。

invokeBeanFactoryPostProcessors

前面巴拉巴拉一大堆,基本还是各种配置、填充工作,这一步就到了IoC容器开始真正干活的阶段了。invokeBeanFactoryPostProcessors(beanFactory)方法主要就是完成对所有注册进来的BeanFactory后置处理器执行调用,包括BeanFactoryPostProcessor及其子类BeanDefinitionRegistryPostProcessor。这里就会有个前面提到的Spring中非常重要的一个类:ConfigurationClassPostProcessor开始被执行,它执行完成后,所有需要Spring管理的Bean都会被解析成BeanDefinition注册进来。由于ConfigurationClassPostProcessor非常的复杂,后续会单独分析这个类,这篇主要是对IoC启动的流程有个大致的、直观印象。执行完这步,你只需要简单知道@Configuration@Bean@Import@ComponentScan@Component等等相关配置注解会被处理,相关的Bean也被解析成BeanDefinition注册进来即可。

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // LTW探测 if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {  beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));  beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); }}

getBeanFactoryPostProcessors()获取到ApplicationContext.beanFactoryPostProcessors集合中存储的BeanFactoryPostProcessor,通过addBeanFactoryPostProcessor()方法添加的,这里集合为空,因为从前面代码看并没有调用过该方法。

这里核心在invokeBeanFactoryPostProcessors()方法。首先,看下if (beanFactory instanceof BeanDefinitionRegistry)判断,如果容器不是BeanDefinitionRegistry类型或子类,则表示当前容器不能向容器注册Bean,所以只需要执行BeanFactoryPostProcessor类型后置处理器即可,BeanDefinitionRegistryPostProcessor后置处理器不需要执行,因为该后置处理器主要是用来向IoC容器中注册Bean,大部分我们使用的容器都是BeanDefinitionRegistry类型,这样才能把我们业务Bean纳入Spring管理,所以基本上都是走if语句块

//判断我们的beanFactory是否实现了BeanDefinitionRegistryif (beanFactory instanceof BeanDefinitionRegistry) { ...//省略}else { invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}

invokeBeanFactoryPostProcessors方法核心就是执行BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor,但是涉及到执行优先级、执行后可能会产生新PostProcessor等,所以这里的代码看起来比较长,总结下执行逻辑大致如下:

1、先执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法,其中BeanDefinitionRegistryPostProcessor执行优先级如下:a、addBeanFactoryPostProcessor()传入到优先级最高,因为不需要实例化,直接可以获取到对象进行执行;b、然后从IoC容器中获取PriorityOrdered接口的BeanDefinitionRegistryPostProcessor,实例化并排序后执行postProcessBeanDefinitionRegistry方法c、然后从IoC容器中获取Ordered接口的BeanDefinitionRegistryPostProcessor,实例化并排序后执行postProcessBeanDefinitionRegistry方法d、然后从IoC容器中获取剩余的BeanDefinitionRegistryPostProcessor,实例化后执行postProcessBeanDefinitionRegistry方法;注意这个处理步骤存在一个循环,主要是存在执行前面的BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法时,存在可能会向IoC容器中注册新的BeanDefinitionRegistryPostProcessor,通过循环保证都会被执行;2、然后执行BeanDefinitionRegistryPostProcessor#postProcessBeanFactory方法,执行顺序参照步骤1中执行顺序;3、最后才会执行BeanFactoryPostProcessor#postProcessBeanFactory,执行优先级和BeanDefinitionRegistryPostProcessor一致:a、addBeanFactoryPostProcessor()传入到优先级最高,因为不需要实例化,直接可以获取到对象进行执行;b、然后从IoC容器中获取PriorityOrdered接口的BeanFactoryPostProcessor,实例化并排序后执行postProcessBeanFactory方法c、然后从IoC容器中获取Ordered接口的BeanFactoryPostProcessor,实例化并排序后执行postProcessBeanFactory方法d、然后从IoC容器中获取剩余的BeanFactoryPostProcessor,实例化后执行postProcessBeanFactory方法

这里有个细节,在执行BeanFactoryPostProcessor#postProcessBeanFactory方法是没有循环,而执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry中存在一个循环,主要是因为BeanFactoryPostProcessor#postProcessBeanFactory方法是不会像IoC中注册Bean,这样执行过程中就不会产生新的BeanFactoryPostProcessor

上面写了一大堆,概况下就是:

1、方法优先级:BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry> BeanDefinitionRegistryPostProcessor#postProcessBeanFactory> BeanFactoryPostProcessor#postProcessBeanFactory

2、同方法优先级:addBeanFactoryPostProcessor> PriorityOrdered> Ordered> 非排序

registerBeanPostProcessors

registerBeanPostProcessors方法主要是将BeanDefinition对应的BeanPostProcessor实例化并通过beanFactory.addBeanPostProcessor()方法注册进来。前面分析过AnnotationConfigUtils.registerAnnotationConfigProcessors会向容器注册几个Spring内置的BeanPostProcessor,这步主要是将应用中引入的BeanPostProcessor注册进来。

上步invokeBeanFactoryPostProcessors执行完成后,Spring会将所有的Bean解析成BeanDefinition注册到容器中,其中就可能包含BeanPostProcessorBeanDefinition信息,这个方法就是把这些BeanPostProcessor对应的BeanDefinition通过getBean方式实例化,并通过addBeanPostProcessor()注册进来,这样这些BeanPostProcessor才能起作用。

这个方法代码巴拉巴拉一大堆,流出总结起来还是很清晰,这里就不再上代码:

获取实现PriorityOrdered接口的BeanPostProcessor,然后通过getBean()方法实例化,排序后注册到容器中;获取实现Ordered接口的BeanPostProcessor,然后通过getBean()方法实例化,排序后注册到容器中;获取常规没有实现PriorityOrderedOrdered接口BeanPostProcessor,然后通过getBean()方法实例化,注册到容器中;上述步骤中MergedBeanDefinitionPostProcessor类型会单独存储到internalPostProcessors集合中,排序后保证放到末尾;最后移除ApplicationListenerDetector重新追加到最末尾。

注意:这里有个细节就是要保证高级别优先级的BeanPostProcessor全部实例化完成后,才可以进行下一个优先级类型的BeanPostProcessor,因为BeanPostProcessor主要就是围绕Bean实例化进行扩展,这样就可以保证高优先级的BeanPostProcessor可以参与到对低优先级的BeanPostProcessor实例化过程中。

和上步invokeBeanFactoryPostProcessors不同的是,这里只是把所有的BeanPostProcessor注册进来,并没有去执行,因为这也很好理解:BeanPostProcessor是围绕在Bean实例化周围的扩展点,这里服务Bean存储在容器中基本都还是BeanDefinition,还没有进行实例化。

initMessageSource

initMessageSource方法主要是处理国际化相关工作,后台开发中很少涉及,这里就不展开分析。

initApplicationEventMulticaster

initApplicationEventMulticaster是上下文环境中初始化一个事件广播器,用于事件发布,后续分析Spring事件机制再整体分析。

onRefresh

onRefresh默认是空实现,模板模式设计主要用于子类扩展。可以参照SpringBootServletWebServerApplicationContext这个类,重写了onRefresh()方法,在这个方法中完成内嵌Servlet容器的创建:TomcatJettyUndertow,将程序内嵌一个Servlet容器后,就可以独立运行。

registerListeners

registerListeners方法主要完成事件监听器注册,将实现了ApplicationListener接口的监听器bean注册到ApplicationEventMulticaster上,在注册完以后,还会将其前期的事件发布给相匹配的监听器。后续分析Spring事件机制再整体分析。

标签:

上一篇 :

金界控股(03918.HK):3月28日南向资金增持50.8万股_每日消息

下一篇 :

贵州茅台:3月28日融券卖出8100股,融资融券余额175.05亿元 环球微动态

推荐阅读

端午小长假南铁预计发送旅客502万人次 客流最高峰预计在6月24日 每日聚焦

端午小长假南铁预计发送旅客502万人次 客流最高峰预计在6月24日 每日聚焦

记者从中国铁路南昌局集团有限公司(以下简称南铁)获悉,2023年端午假

2023-06-15
问诊贷款直播 该注意哪些边界和红线?

问诊贷款直播 该注意哪些边界和红线?

(原标题:问诊贷款直播)近期关于贷款直播的话题引发业内关

2023-06-15
【热闻】中信证券:当前电动重卡渗透率加速的奇点已经到来

【热闻】中信证券:当前电动重卡渗透率加速的奇点已经到来

6月15日消息,中信证券研报指出,6月12日,宁德时代发布重卡底盘换电解

2023-06-15
世界新消息丨大吉!海淀四季青大地块由越秀竞得

世界新消息丨大吉!海淀四季青大地块由越秀竞得

大吉!海淀四季青大地块由越秀竞得,越秀,金源,顺义区,海淀区,四季青,建

2023-06-15
深圳市龙华区综合医院竣工验收,打造康复花园式医院 世界微资讯

深圳市龙华区综合医院竣工验收,打造康复花园式医院 世界微资讯

“依山傍水,生命绿动”。近日,由中建深装参建的顺应山势而建的康复花

2023-06-15
按图索冀|雄山碧水添秀色

按图索冀|雄山碧水添秀色

初夏时节,位于邢台市西部太行山深处的云梦山景区层峦叠嶂,碧水如镜,

2023-06-15
环球微头条丨富时指数

环球微头条丨富时指数

富时指数又被叫做富时100指数,具体是指由富时集团编制的股票指数。富

2023-06-15
[视频]神舟十六号在轨半个月 空间站组合体运行稳定 时讯

[视频]神舟十六号在轨半个月 空间站组合体运行稳定 时讯

央视网消息(新闻联播):神舟十六号航天员乘组已在轨半个月,目前空间

2023-06-15
全球今热点:飞步科技杨政:瞄准 L5 级自动驾驶,坚持“点变圈,变更大圈”渐进式路线

全球今热点:飞步科技杨政:瞄准 L5 级自动驾驶,坚持“点变圈,变更大圈”渐进式路线

文 周菊2023年6月13日,由经济观察报主办的梦想照进现实——自动驾驶发

2023-06-15
霁红釉瓷器特点_霁红釉

霁红釉瓷器特点_霁红釉

1、霁红釉是清康熙仿明宣德的产品,釉色不像郎窑红浓艳,也不如豇豆红

2023-06-14
温州品牌女装批发市场_温州品牌女装

温州品牌女装批发市场_温州品牌女装

1、温州乔奴服饰有限公司2、乔奴服饰整合了优质的产品研发、服装设计生

2023-06-14
世界今头条!2023郑东新区吉瑞路社区卫生服务中心九价预约(6月14日)

世界今头条!2023郑东新区吉瑞路社区卫生服务中心九价预约(6月14日)

01预约人群16-26岁女性;不限户籍;仅限首针在本门诊接种过的居民预约

2023-06-14
氧化铁脱硫剂原材料(氧化铁脱硫剂)

氧化铁脱硫剂原材料(氧化铁脱硫剂)

当前大家对于氧化铁脱硫剂都是颇为感兴趣的,大家都想要了解一下氧化铁

2023-06-14
男子熬夜喝冰镇饮料被送进ICU 妻子:喝冰饮是诱发急性胰腺炎的诱因 天天热讯

男子熬夜喝冰镇饮料被送进ICU 妻子:喝冰饮是诱发急性胰腺炎的诱因 天天热讯

近日,广东深圳。男子暴饮暴食熬夜引发急性胰腺炎。陈先生妻子表示:老

2023-06-14
最新!全国各地2023高考查分时间汇总 视焦点讯

最新!全国各地2023高考查分时间汇总 视焦点讯

2023年全国高考结束,各地转入高考阅卷工作。目前,全国各地陆续公布今

2023-06-14
应急演练!“火”速行动,防范未“燃”

应急演练!“火”速行动,防范未“燃”

今年6月是全国第22个安全生产月。为进一步加强安全生产知识宣传教育,

2023-06-14
世界今头条!建绿色低碳发展新模式试验区 滨海新区发布行动方案

世界今头条!建绿色低碳发展新模式试验区 滨海新区发布行动方案

记者14日从滨海新区获悉,作为滨海新区高质量发展支撑引领行动八大工程

2023-06-14
通威股份:截至2022年底 公司高效太阳能电池总产能超过70GW TNC产能达到9GW

通威股份:截至2022年底 公司高效太阳能电池总产能超过70GW TNC产能达到9GW

每经AI快讯,有投资者在投资者互动平台提问:董秘您好,公司2022年半年

2023-06-14
当前滚动:在聚焦高精尖产品上下功夫

当前滚动:在聚焦高精尖产品上下功夫

周口日报全媒体记者高洪驰6月14日,河南省“万人助万企”活动第16服务

2023-06-14
全球信息:171开头手机号是哪个公司的 171开头的手机号是做什么的

全球信息:171开头手机号是哪个公司的 171开头的手机号是做什么的

2、171开头的手机号属于哪个公司天津。3、171手机话费充值平台。4、171

2023-06-14
每日观点:她在《红楼梦》中擅长伪装,王熙凤对她无可奈何,演技瞒过贾母!

每日观点:她在《红楼梦》中擅长伪装,王熙凤对她无可奈何,演技瞒过贾母!

红楼梦中有很多擅长伪装的人,说白了就是会演戏的人,贾府的关系比较复

2023-06-14
快播:Infinix Note 30 VIP 由八核 Med​​iaTek Dimensity 8050 SoC 提供支持

快播:Infinix Note 30 VIP 由八核 Med​​iaTek Dimensity 8050 SoC 提供支持

InfinixNote30VIP于周二在全球发布。这是今年5月初推出的InfinixNote30系列的

2023-06-14
7天无侧限抗压强度试验怎么做_7天无侧限抗压强度试验 世界实时

7天无侧限抗压强度试验怎么做_7天无侧限抗压强度试验 世界实时

1、标准试块尺寸是:内径150mm,高150mm圆柱体试模。2、无侧限抗压强度

2023-06-14
传奇手游公益版本推荐 十大公益版本传奇手游合集

传奇手游公益版本推荐 十大公益版本传奇手游合集

,今天小编给大家整理2023传奇手游排行榜,游戏里的传奇世界boss限时开

2023-06-14
06月14日江苏皮棉为17552元 每日热文

06月14日江苏皮棉为17552元 每日热文

  06月14日江苏地区关于皮棉的报价为17552元 吨。皮棉的规格:3128B

2023-06-14
好声音亚军张恒远去世,导师汪峰发文悼念,会帮助毕夏渡过难关

好声音亚军张恒远去世,导师汪峰发文悼念,会帮助毕夏渡过难关

好声音学员刘雅婷发文悼念张恒远,他们多年前在深圳偶遇,成为好友,张

2023-06-14
国台办:坚决反对我建交国与中国台湾地区开展任何形式的军事联系

国台办:坚决反对我建交国与中国台湾地区开展任何形式的军事联系

据央视新闻客户端报道:6月14日,国台办发言人朱凤莲主持例行新闻发布

2023-06-14
【天天新要闻】圣元环保:6月13日融资买入201.68万元,融资融券余额2.3亿元

【天天新要闻】圣元环保:6月13日融资买入201.68万元,融资融券余额2.3亿元

6月13日,圣元环保(300867)融资买入201 68万元,融资偿还156 81万元

2023-06-14
深圳市前海管理局与爱思唯尔联合发布“国际科研人才生态创新计划”-世界信息

深圳市前海管理局与爱思唯尔联合发布“国际科研人才生态创新计划”-世界信息

国际权威学术出版商爱思唯尔深圳办公室6月13日在前海揭牌。深圳市前海

2023-06-14
2023工商企业管理是学什么的 毕业后能干嘛

2023工商企业管理是学什么的 毕业后能干嘛

工商企业管理专业的主干课程主要有微观经济学、宏观经济学、会计学原理

2023-06-14
全球快看:四位实力派基金经理!结构性行情下的新探索

全球快看:四位实力派基金经理!结构性行情下的新探索

2023年以来,A股结构性行情加剧,部分押注赛道的绩优基金产品出现回撤

2023-06-14
【全球独家】青岛银行:6月13日融券卖出金额8.74万元,占当日流出金额的0.29%

【全球独家】青岛银行:6月13日融券卖出金额8.74万元,占当日流出金额的0.29%

同花顺数据中心显示,青岛银行6月13日获融资买入332 55万元,占当日买

2023-06-14
环球通讯!不打自招!普京:因为卡霍夫卡大坝被炸毁,乌军才无法在那里反攻

环球通讯!不打自招!普京:因为卡霍夫卡大坝被炸毁,乌军才无法在那里反攻

不打自招!普京:因为卡霍夫卡大坝被炸毁,乌军才无法在那里反攻,普京,

2023-06-14
机械加法器的原理_机械加法器是在哪年由谁发明的|环球微资讯

机械加法器的原理_机械加法器是在哪年由谁发明的|环球微资讯

1、帕斯卡1623年出生在法国一位数学家家庭,他三岁丧母,由担任着税务

2023-06-14
【热闻】江苏打造全国知识产权保护高地

【热闻】江苏打造全国知识产权保护高地

今年4月,国家知识产权局确定10个城市(地区)为首批国家知识产权保护

2023-06-14
“两节”有了第二现场,上海影视节元宇宙体验路演中心首发上线

“两节”有了第二现场,上海影视节元宇宙体验路演中心首发上线

上海国际电影电视节元宇宙体验路演中心在亚洲首个影视PLUS元宇宙Metafi

2023-06-14
经济日报携手京东发布数据 护眼产品怎样“叫得响”

经济日报携手京东发布数据 护眼产品怎样“叫得响”

数据来源京东消费及产业发展研究院近年来,电子产品快速普及、使用频率

2023-06-14
加冕三冠王后解体?曝曼城7人将离队,京多安获2年2亿合同

加冕三冠王后解体?曝曼城7人将离队,京多安获2年2亿合同

战胜国米之后,曼城队史首次赢得欧冠冠军,成为史上第八支加冕三冠王的

2023-06-14
【环球速看料】上海电视台纪实频道官网(上海电视台纪实频道)

【环球速看料】上海电视台纪实频道官网(上海电视台纪实频道)

豆来为大家解答以上的问题。上海电视台纪实频道官网,上海电视台纪实频

2023-06-14
番禺两宗地块触顶摇号 收金23.27亿-前沿热点

番禺两宗地块触顶摇号 收金23.27亿-前沿热点

番禺两宗地块触顶摇号收金23 27亿,番禺,摇号,涉宅,土拍,流拍,广州市,商

2023-06-14
民生银行首席经济学家温彬表示,5月M2同比增速延续高位回落,主要受去年高基数效应、当月信贷派生力度有所减弱等因素影响 全球焦点

民生银行首席经济学家温彬表示,5月M2同比增速延续高位回落,主要受去年高基数效应、当月信贷派生力度有所减弱等因素影响 全球焦点

民生银行首席经济学家温彬表示,5月M2同比增速延续高位回落,主要受去

2023-06-13
全球新动态:理想周销量0.84万辆再创新高!李想:明年总销量有信心超过BBA!公司5月营收刚超百亿

全球新动态:理想周销量0.84万辆再创新高!李想:明年总销量有信心超过BBA!公司5月营收刚超百亿

6月13日,理想汽车官方微信公众号发文称,在刚刚过去的2023年第24周(6

2023-06-13
首发4999元 ROG掌机正式发售:媲美PS5性能 3A大作无压力

首发4999元 ROG掌机正式发售:媲美PS5性能 3A大作无压力

首发4999元ROG掌机正式发售:媲美PS5性能3A大作无压力

2023-06-13
全球新资讯:南起丰悦路北至丰业大道 沣东新城天章三路正式通车

全球新资讯:南起丰悦路北至丰业大道 沣东新城天章三路正式通车

作为西咸新区沣东新城先进制造产业园核心区主要道路,日前,天章三路正

2023-06-13
当前动态:江苏美术省统考考哪些和其他有什么差别专业内容

当前动态:江苏美术省统考考哪些和其他有什么差别专业内容

1、江苏美术省统考考哪些江苏的美术高考分数线是按文化和美术的总分计

2023-06-13
每天取送装有金条的快递,他渐渐感觉不对劲了……

每天取送装有金条的快递,他渐渐感觉不对劲了……

每天取送装有金条的快递,他渐渐感觉不对劲了……,方圆杂志6月13日讯,

2023-06-13
活力夜中国丨是传统的也是先进的 景德镇的陶瓷也太百搭了 即时焦点

活力夜中国丨是传统的也是先进的 景德镇的陶瓷也太百搭了 即时焦点

中国的发展不舍昼夜,不断向前,无论白天还是夜晚都充满活力。《活力夜

2023-06-13
微视频:我的C919_每日简讯

微视频:我的C919_每日简讯

03:18“我的相机里、收藏柜里,终于有了中国产的大飞机!”——孙晓蒙

2023-06-13
林心如拍摄慈善宣传片用手挡女儿的脸 被吐槽“又当又立”

林心如拍摄慈善宣传片用手挡女儿的脸 被吐槽“又当又立”

林心如带女儿拍摄慈善宣传片,林心如母女合体,女儿依旧未露脸!6月12日

2023-06-13
环球简讯:丧茶 喜茶_丧茶是什么意思是什么简介介绍

环球简讯:丧茶 喜茶_丧茶是什么意思是什么简介介绍

对于丧茶是什么意思是什么这个问题感兴趣的朋友应该很多,这个也是目前

2023-06-13
【环球新视野】仰望U8:合二为一,开辟市场

【环球新视野】仰望U8:合二为一,开辟市场

仰望U8:合二为一,开辟市场过去的中国汽车市场,一个本土品牌想要突破

2023-06-13
天天速读:水立方场馆外围市政供热管道突发爆裂,部分业态暂停营业

天天速读:水立方场馆外围市政供热管道突发爆裂,部分业态暂停营业

央视网消息:6月13日,国家游泳中心发布紧急通知称,因场馆外围市政供

2023-06-13
【世界速看料】2023年6月13日N-甲基吡咯烷酮价格最新行情预测

【世界速看料】2023年6月13日N-甲基吡咯烷酮价格最新行情预测

中国报告大厅2023年6月13日N-甲基吡咯烷酮价格最新走势监测显示:安徽

2023-06-13
抚松宾馆电话号码_抚松宾馆|环球滚动

抚松宾馆电话号码_抚松宾馆|环球滚动

1、地疗:标间480元 天(打折后280元 天)(地方)矿疗:标间480元 天

2023-06-13
西强东弱?近25年总决赛西部球队17次夺冠 西部总战绩为84胜56负

西强东弱?近25年总决赛西部球队17次夺冠 西部总战绩为84胜56负

西强东弱?近25年总决赛西部球队17次夺冠西部总战绩为84胜56负,热火队,

2023-06-13
高压快充概念拉升 和顺电气“20cm”涨停 迦南智能等大涨 当前聚焦

高压快充概念拉升 和顺电气“20cm”涨停 迦南智能等大涨 当前聚焦

高压快充概念13日盘中强势拉升,和顺电气“20cm”涨停,迦南智能涨约15

2023-06-13
hp1005打印机用什么硒鼓_hp1005打印机 全球即时

hp1005打印机用什么硒鼓_hp1005打印机 全球即时

1、多数是数据线或者设置问题。2、删除所有打印任务,关闭打印机电源,

2023-06-13
胸口中间骨头按着有点疼_胸口中间骨头按压疼什么原因-微头条

胸口中间骨头按着有点疼_胸口中间骨头按压疼什么原因-微头条

1、病情分析:最近是否有胸部外伤或最近一周有呼吸道感染史。2、一般胸

2023-06-13
06月13日猪评:猪价回温,月底能否翻红?

06月13日猪评:猪价回温,月底能否翻红?

2023年06月13日(星期二),中国养猪网猪价系统数据监测如下:生猪(品

2023-06-13
支持生产性互联网服务平台发展

支持生产性互联网服务平台发展

市委副书记、市长龚正昨天主持召开市政府常务会议,要求按照市委部署,

2023-06-13
电脑屏幕识别文字快捷键_电脑屏幕文字识别软件_资讯推荐

电脑屏幕识别文字快捷键_电脑屏幕文字识别软件_资讯推荐

1、尽管专业的OCR文字识别电脑端软件很多,手机APP也不少,但如果你想

2023-06-13
刘沧龙的四川宏达被“重整”,欠下长城华西银行多少坏账?|焦点资讯

刘沧龙的四川宏达被“重整”,欠下长城华西银行多少坏账?|焦点资讯

来源:密探财经(ID:SpyFinance)“宏达系”的陨落,似乎跟“金融玩砸

2023-06-13
世界热资讯!消息称欧盟监管机构要求谷歌出售部分广告技术业务

世界热资讯!消息称欧盟监管机构要求谷歌出售部分广告技术业务

IT之家6月13日消息,消息人士昨日向路透社透露称,欧盟反垄断监管机构

2023-06-13
今年以来券商发债规模同比增近四成

今年以来券商发债规模同比增近四成

今年以来,发行债券成为券商机构重要的补充流动性的方式之一。Wind数据

2023-06-13
有全尺寸备胎的轿车_哪些车型带全尺寸备胎?

有全尺寸备胎的轿车_哪些车型带全尺寸备胎?

带全尺寸备胎的车型有:长城C50、北京现代悦动(参数|询价)、东风标致30

2023-06-13
精彩看点:黄金龙头央企,多元布局发力

精彩看点:黄金龙头央企,多元布局发力

第一时间提供各大券商研究所报告,最大程度减少个人投资者与机构之间信

2023-06-13
每日快报!罗云峰与长三角聚劲科创大赛嘉宾代表举行工作会谈

每日快报!罗云峰与长三角聚劲科创大赛嘉宾代表举行工作会谈

罗云峰与长三角聚劲科创大赛嘉宾代表举行工作会谈

2023-06-13
环球视点!压力容器安全操作规程要点_压力容器安全操作规程

环球视点!压力容器安全操作规程要点_压力容器安全操作规程

1、压力容器安全操作规程(需上墙悬挂)一.总则1.压力容器操作人员必

2023-06-13
联合国教科文组织巴黎宣布:第五届世界生物圈保护区大会杭州举办

联合国教科文组织巴黎宣布:第五届世界生物圈保护区大会杭州举办

北京时间6月12日深夜,巴黎传来消息:经联合国教科文组织人与生物圈计

2023-06-13
世界简讯:刺绣二股线怎么穿针(刺绣2股线)

世界简讯:刺绣二股线怎么穿针(刺绣2股线)

先把两根细线依次穿进针孔里,之后让那两根线长短对折,而不是相等对折,

2023-06-13
女人夏天选择尖头细高跟鞋,好看款式超高

女人夏天选择尖头细高跟鞋,好看款式超高

很多女性都知道哪种款式更适合自己。尖尖的细高跟鞋也可以搭配出精致的

2023-06-13
【世界独家】宁远县归哪个省_宁远县属于什么市

【世界独家】宁远县归哪个省_宁远县属于什么市

1、宁远一中:永州市重华北路8号宁远二中:九嶷中路133号宁远三中:重

2023-06-12
5月网约车行业运行情况公布 基本信息讲解

5月网约车行业运行情况公布 基本信息讲解

大家好,今日关于【5月网约车行业运行情况公布】的话题登上了各大平台

2023-06-12
世界观焦点:中集安瑞科首获4万方LPG液氨运输船订单

世界观焦点:中集安瑞科首获4万方LPG液氨运输船订单

近日,中集安瑞科旗下中集太平洋海工与液化气船船东AvanceGas,签订2+2

2023-06-12
马达控制器的作用_马达控制器 全球新消息

马达控制器的作用_马达控制器 全球新消息

1、智能马达控制器,适用于额定电压至AC690V、额定电流至AC800A、额定

2023-06-12
你了解停工留薪期吗?

你了解停工留薪期吗?

工伤职工停工留薪期是指职工因工作遭受事故伤害或者患职业病后,需要暂

2023-06-12
头条焦点:画质巅峰获大咖推荐 海信E8成高端MiniLED电视爆款

头条焦点:画质巅峰获大咖推荐 海信E8成高端MiniLED电视爆款

每年一度的“618”作为家电产品销售旺季,也是电视升级换代的最佳时机

2023-06-12
56岁阿姨很豪爽,相亲当天就同居,第二天起床直呼自己太年轻

56岁阿姨很豪爽,相亲当天就同居,第二天起床直呼自己太年轻

56岁阿姨很豪爽,相亲当天就同居,第二天起床直呼自己太年轻,红娘,医生

2023-06-12
灞桥区“灞水英才荟”系列公开课第二期奋楫扬帆篇活力开讲|微资讯

灞桥区“灞水英才荟”系列公开课第二期奋楫扬帆篇活力开讲|微资讯

6月8日灞桥区“灞水英才荟”系列公开课第二期——“集智聚力展拳脚惠企

2023-06-12
2023湖北省十堰市茅箭区面向全国招聘高层次人才资格复审公告

2023湖北省十堰市茅箭区面向全国招聘高层次人才资格复审公告

2023年湖北省十堰市茅箭区面向全国公开招聘高层次人才报名已结束,根据

2023-06-12
今日播报!广西调运1万多件应急物资支援合浦防汛救灾

今日播报!广西调运1万多件应急物资支援合浦防汛救灾

南宁6月11日电(记者吴思思)记者从广西壮族自治区粮食和物资储备局获

2023-06-12
A股市场午后回暖:三大股指涨跌互现,汽车产业链全线爆发 环球快讯

A股市场午后回暖:三大股指涨跌互现,汽车产业链全线爆发 环球快讯

A股三大股指6月12日集体低开后,指数继续分化。早盘沪弱深强格局再现,

2023-06-12
环球观焦点:新华制药(000756):技术指标出现看涨信号-KDJ 低位金叉(06-12)

环球观焦点:新华制药(000756):技术指标出现看涨信号-KDJ 低位金叉(06-12)

摘要:2023年06月12日新华制药(000756)主力资金净流入253 16万元,占

2023-06-12
漫威:就该这么办!重启!《夜魔侠》《捍卫者》已归来!

漫威:就该这么办!重启!《夜魔侠》《捍卫者》已归来!

相信不少小伙伴都对漫威在20年有何计划都很是期待,因为在很早的时候,

2023-06-12
环球热点评!中金普洛斯REIT多家定向扩募投资者办理完成限售业务

环球热点评!中金普洛斯REIT多家定向扩募投资者办理完成限售业务

REITs场内份额限售总量327,719,955份,除了GLP普洛斯资本投资4号香港有

2023-06-12
哥白尼日心说_哥白尼

哥白尼日心说_哥白尼

1、康德自诩他在哲学上做了一个“哥白尼式的革命”,就是说他在哲学上

2023-06-12
全球消息!单位行贿罪受到什么处罚

全球消息!单位行贿罪受到什么处罚

根据刑法规定,构成对单位行贿罪的,处三年以下有期徒刑或拘役。单位犯

2023-06-12
保持室内植物存活的 10 个提示和技巧

保持室内植物存活的 10 个提示和技巧

没有绿拇指?不用担心。你带回家的每一株新植物都不会在几周内死去。让

2023-06-12
大叔未偷拍仍遭曝光,涉事女子公开道歉|环球热点

大叔未偷拍仍遭曝光,涉事女子公开道歉|环球热点

2023-06-12
海军工程大学紧跟发展趋势优化课程体系建设——学科融合释放新活力

海军工程大学紧跟发展趋势优化课程体系建设——学科融合释放新活力

该校教员吴玲指导学员开展实验。

2023-06-12
浏阳:大山里的“非遗生态村”

浏阳:大山里的“非遗生态村”

近日,地处大围山腹地浏阳市张坊镇道官冲非遗活态传承山村,逐渐热闹起

2023-06-11
国网河南电力:以有力监督守护民生福祉 天天微速讯

国网河南电力:以有力监督守护民生福祉 天天微速讯

6月,中原大地遍野金黄,田间地头一片繁忙收获景象。近日,河南宝丰县4

2023-06-11
蔚来一季度营收106.8亿元,汽车毛利率仅为5.1%

蔚来一季度营收106.8亿元,汽车毛利率仅为5.1%

“蔚来预计二季度营收、车辆交付量均下降。”

2023-06-11
用小说法,而以记史_世界今日报

用小说法,而以记史_世界今日报

《说史记:小说一样的历史》杨早 著后浪|北京联合出版公司鲁迅在《中国

2023-06-11
黑天鹅蛋糕官网价格表(黑天鹅蛋糕)

黑天鹅蛋糕官网价格表(黑天鹅蛋糕)

来为大家解答以上的问题。黑天鹅蛋糕官网价格表,黑天鹅蛋糕这个很多人

2023-06-11
奇门遁甲八门中哪一门不属于吉门?_奇门遁甲八门中哪一门不属于吉门

奇门遁甲八门中哪一门不属于吉门?_奇门遁甲八门中哪一门不属于吉门

1、严格来说。2、八门之中。3、杜门是不属于吉门。本文就为大家分享到

2023-06-11
桂花酒的制作方法家常_桂花酒的制作方法

桂花酒的制作方法家常_桂花酒的制作方法

1、原料:金桂、白糖、米酒或高梁酒、桂园肉和十克白参、一百克红枣。2

2023-06-11
“五彩湘茶”九大品牌进京推介,与合作茶企达成产销对接

“五彩湘茶”九大品牌进京推介,与合作茶企达成产销对接

新京报讯(记者王子扬)2023北京国际茶业展、北京马连道国际茶文化展、

2023-06-11
当前要闻:乳晕变大是怎么回事(乳晕大怎么回事)

当前要闻:乳晕变大是怎么回事(乳晕大怎么回事)

1、般说来论胸部罩杯大小正常乳晕直径3-5公分颜色粉红色乳晕随着青春期

2023-06-11
证监会就公开募集证券投资基金投资顾问业务管理规定公开征求意见

证监会就公开募集证券投资基金投资顾问业务管理规定公开征求意见

新华社北京6月9日电(记者刘羽佳)证监会官网9日发布消息,为健全资本市

2023-06-11
x 广告
x 广告

Copyright ©  2015-2022 南极水产网版权所有  备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com