refreshContext(二)

简介: refreshContext


invokeBeanFactoryPostProcessors(beanFactory)

  • 代码段image.png
  • 调用所有注册的处理器
  • 主要代码逻辑:PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
  • BeanDefinitionRegistryPostProcessor:
  • BeanDefinitionRegistryPostProcessor是对BeanFactoryPostProcessor的拓展
  • BeanDefinitionRegistryPostProcessor优先级更高
  • BeanDefinitionRegistryPostProcessor可以注册进一步的bean定义,通过这些定义来进一步定义BeanFactoryPostProcessor
  • BeanDefinitionRegistry:bean定义注册的规范的标准接口
public static void invokeBeanFactoryPostProcessors(
        ConfigurableListableBeanFactory beanFactory,List<BeanFactoryPostProcessor> beanFactoryPostProcessors){
        // 所有已经执行的PostProcessors都会在这,用于防止重复执行
        Set<String> processedBeans=new HashSet<>();
        //判断当前工厂是否与BeanDefinitionRegistry(bean定义的注册接口)存在关联
        if(beanFactory instanceof BeanDefinitionRegistry){
        BeanDefinitionRegistry registry=(BeanDefinitionRegistry)beanFactory;
        //普通BeanFactoryPostProcessor的list
        List<BeanFactoryPostProcessor> regularPostProcessors=new ArrayList<>();
        //高优先级BeanDefinitionRegistryPostProcessor的list
        List<BeanDefinitionRegistryPostProcessor> registryProcessors=new ArrayList<>();
        for(BeanFactoryPostProcessor postProcessor:beanFactoryPostProcessors){
        //对于优先级更高的BeanDefinitionRegistryPostProcessor加入
        if(postProcessor instanceof BeanDefinitionRegistryPostProcessor){
        BeanDefinitionRegistryPostProcessor registryProcessor=
        (BeanDefinitionRegistryPostProcessor)postProcessor;
        //通过构建者模式建造元数据共享器的定义,最终将元数据共享器的定义注册到BeanDefinitionRegistryPostProcessor
        registryProcessor.postProcessBeanDefinitionRegistry(registry);
        //将BeanFactoryPostProcessor中高优先级的BeanDefinitionRegistryPostProcessors加入list
        registryProcessors.add(registryProcessor);
        }
        else{
        //将普通的BeanFactoryPostProcessor加入到list
        regularPostProcessors.add(postProcessor);
        }
        }
        List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors=new ArrayList<>();
        //通过beanFactory匹配所有与(高优先级)BeanDefinitionRegistryPostProcessor存在联系的beanName并且转化为数组
        String[]postProcessorNames=
        beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false);
        for(String ppName:postProcessorNames){
        //对匹配之后的数组进行二次匹配,是否实现了优先级序列接口
        if(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){
        //这个地方的getBean有操作,这里不细说????
        currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class));
        //加入Set集合
        processedBeans.add(ppName);
        }
        }
        //对currentRegistryProcessors进行排序
        sortPostProcessors(currentRegistryProcessors,beanFactory);
        //将排序后的list加入registryProcessors
        registryProcessors.addAll(currentRegistryProcessors);
        //这个当然就是执行相关逻辑呀,具体是啥我也不知道,但是跟@Configration,@Bean......有关
        //认为是对于PostProcessors的处理,将PostProcessors定义成为bean
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry);
        //清除缓存
        currentRegistryProcessors.clear();
        //从BeanFactory加载BeanDefinitionRegistryPostProcessor的bean集合
        postProcessorNames=beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false);
        for(String ppName:postProcessorNames){
        //对集合进行筛选,实现了Ordered接口的进行处理
        if(!processedBeans.contains(ppName)&&beanFactory.isTypeMatch(ppName,Ordered.class)){
        currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class));
        processedBeans.add(ppName);
        }
        }
        sortPostProcessors(currentRegistryProcessors,beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry);
        currentRegistryProcessors.clear();
        //最后,对优先级最低BeanDefinitionRegistryPostProcessors执行逻辑
        boolean reiterate=true;
        while(reiterate){
        reiterate=false;
        postProcessorNames=beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false);
        for(String ppName:postProcessorNames){
        if(!processedBeans.contains(ppName)){
        currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class));
        processedBeans.add(ppName);
        reiterate=true;
        }
        }
        sortPostProcessors(currentRegistryProcessors,beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry);
        currentRegistryProcessors.clear();
        }
        //在@Configuration类中声明的任何Bean方法都必须在任何其他BeanFactoryPostProcessor执行之前注册其相应的 bean 定义,
        invokeBeanFactoryPostProcessors(registryProcessors,beanFactory);
        //这是低优先级处理,这里对Environment进行了处理
        invokeBeanFactoryPostProcessors(regularPostProcessors,beanFactory);
        }
        else{
        // 如果没有实现<br>bean定义的注册接口<br>
        invokeBeanFactoryPostProcessors(beanFactoryPostProcessors,beanFactory);
        }
        //获取beanFactory实现了BeanFactoryPostProcessor(低优先级PostProcessor)的beanName,实现了BeanFactoryPostProcessor
        String[]postProcessorNames=
        beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class,true,false);
        //将过滤后的beanFactory数组分为三个级别
        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors=new ArrayList<>();
        List<String> orderedPostProcessorNames=new ArrayList<>();
        List<String> nonOrderedPostProcessorNames=new ArrayList<>();
        for(String ppName:postProcessorNames){
        //对在高优先级以及处理的,低优先级不给予处理
        if(processedBeans.contains(ppName)){
        // skip - already processed in first phase above
        }
        //高优先级筛选
        else if(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){
        priorityOrderedPostProcessors.add(beanFactory.getBean(ppName,BeanFactoryPostProcessor.class));
        }
        //低优先级筛选
        else if(beanFactory.isTypeMatch(ppName,Ordered.class)){
        orderedPostProcessorNames.add(ppName);
        }
        //无优先级筛选
        else{
        nonOrderedPostProcessorNames.add(ppName);
        }
        }
        // 先处理(高优先级) PriorityOrdered.
        sortPostProcessors(priorityOrderedPostProcessors,beanFactory);
        invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors,beanFactory);
        // 在处理(低优先级) Ordered.
        List<BeanFactoryPostProcessor> orderedPostProcessors=new ArrayList<>(orderedPostProcessorNames.size());
        for(String postProcessorName:orderedPostProcessorNames){
        orderedPostProcessors.add(beanFactory.getBean(postProcessorName,BeanFactoryPostProcessor.class));
        }
        sortPostProcessors(orderedPostProcessors,beanFactory);
        invokeBeanFactoryPostProcessors(orderedPostProcessors,beanFactory);
        // 最后处理 没有优先级的.
        List<BeanFactoryPostProcessor> nonOrderedPostProcessors=new ArrayList<>(nonOrderedPostProcessorNames.size());
        for(String postProcessorName:nonOrderedPostProcessorNames){
        nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName,BeanFactoryPostProcessor.class));
        }
        invokeBeanFactoryPostProcessors(nonOrderedPostProcessors,beanFactory);
        // Clear cached merged bean definitions since the post-processors might have
        // modified the original metadata, e.g. replacing placeholders in values...
        beanFactory.clearMetadataCache();
        }
  • invokeBeanFactoryPostProcessors中主要做了以下几件事事情
  • 将BeanFactory中的所有已经注册了bean定义的bean分为两类:
  • 高优先级(BeanDefinitionRegistryPostProcessor)类
  • 低优先级(BeanFactoryPostProcessor)类
  • 对上述两类的所有bean进行了处理,分为了三个等级priorityOrdered,ordered,nonOrdered(优先级依次递减);
  • 调用了所有BeanFactory的处理器,并且对配置类@Configuration以及@Bean进行了处理

registerBeanPostProcessors(beanFactory)

 

public static void registerBeanPostProcessors(
        ConfigurableListableBeanFactory beanFactory,AbstractApplicationContext applicationContext){
        //通过getBeanNamesForType获取beanFactory中与BeanPostProcessor存在联系的beanName
        String[]postProcessorNames=beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);
        //注册BeanPostProcessorChecker
        int beanProcessorTargetCount=beanFactory.getBeanPostProcessorCount()+1+postProcessorNames.length;
        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory,beanProcessorTargetCount));
        //将实现了PriorityOrdered、Ordered接口的BeanPostProcessors分开处理
        List<BeanPostProcessor> priorityOrderedPostProcessors=new ArrayList<>();
        List<BeanPostProcessor> internalPostProcessors=new ArrayList<>();
        List<String> orderedPostProcessorNames=new ArrayList<>();
        List<String> nonOrderedPostProcessorNames=new ArrayList<>();
        for(String ppName:postProcessorNames){
        //bean实现了PriorityOrdered
        if(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){
        BeanPostProcessor pp=beanFactory.getBean(ppName,BeanPostProcessor.class);
        priorityOrderedPostProcessors.add(pp);
        //且bean实现了MergedBeanDefinitionPostProcessor
        if(pp instanceof MergedBeanDefinitionPostProcessor){
        internalPostProcessors.add(pp);
        }
        }
        //bean实现了Ordered
        else if(beanFactory.isTypeMatch(ppName,Ordered.class)){
        orderedPostProcessorNames.add(ppName);
        }
        //都没有实现
        else{
        nonOrderedPostProcessorNames.add(ppName);
        }
        }
        //对priorityOrderedPostProcessors的list进行排序
        sortPostProcessors(priorityOrderedPostProcessors,beanFactory);
        //this.beanPostProcessors.add(beanPostProcessor);将BeanPostProcessor添加到list的队尾
        registerBeanPostProcessors(beanFactory,priorityOrderedPostProcessors);
        // 对实现了Ordered接口的bean进行处理.
        List<BeanPostProcessor> orderedPostProcessors=new ArrayList<>(orderedPostProcessorNames.size());
        for(String ppName:orderedPostProcessorNames){
        BeanPostProcessor pp=beanFactory.getBean(ppName,BeanPostProcessor.class);
        orderedPostProcessors.add(pp);
        if(pp instanceof MergedBeanDefinitionPostProcessor){
        internalPostProcessors.add(pp);
        }
        }
        //排序order的list
        sortPostProcessors(orderedPostProcessors,beanFactory);
        //注册BeanPostProcessors,加入队尾
        registerBeanPostProcessors(beanFactory,orderedPostProcessors);
        //最后,对普通的BeanPostProcessor进行处理
        List<BeanPostProcessor> nonOrderedPostProcessors=new ArrayList<>(nonOrderedPostProcessorNames.size());
        for(String ppName:nonOrderedPostProcessorNames){
        BeanPostProcessor pp=beanFactory.getBean(ppName,BeanPostProcessor.class);
        nonOrderedPostProcessors.add(pp);
        if(pp instanceof MergedBeanDefinitionPostProcessor){
        internalPostProcessors.add(pp);
        }
        }
        registerBeanPostProcessors(beanFactory,nonOrderedPostProcessors);
        sortPostProcessors(internalPostProcessors,beanFactory);
        registerBeanPostProcessors(beanFactory,internalPostProcessors);
        //这里注册了ApplicationListenerDetector,但是不知道干嘛
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
        }
• registerBeanPostProcessors的关键逻辑代码
    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){
        //bean的处理器不能为空
        Assert.notNull(beanPostProcessor,"BeanPostProcessor must not be null");
        // 去除旧的beanPostProcessor
        this.beanPostProcessors.remove(beanPostProcessor);
        //是否开启
        //添加实例化前回调的BeanPostProcessor子接口,以及实例化后但在设置显式属性或发生自动装配之前的回调
        //用于抑制特定目标 bean 的默认实例化
        if(beanPostProcessor instanceof InstantiationAwareBeanPostProcessor){
        this.hasInstantiationAwareBeanPostProcessors=true;
        }
        //是否开启
        //添加销毁前回调的BeanPostProcessor的子接口.
        if(beanPostProcessor instanceof DestructionAwareBeanPostProcessor){
        this.hasDestructionAwareBeanPostProcessors=true;
        }
        //为所有新增的beanPostProcessor置于队列尾部
        this.beanPostProcessors.add(beanPostProcessor);
        }

initMessageSource()

  • 初始化ConfigurableListableBeanFactory的MessageSources,如果不存在MessageSources,则注册单例MessageSources(没什么好说的,代码一眼真🚀️)

initApplicationEventMulticaster()

  • 初始化ApplicationEventMulticaster,如果ConfigurableListableBeanFactory中没有定义,则注册单例SimpleApplicationEventMulticaster

onRefresh()

  • 初始化Tomcat容器,并且启动

onRefresh->createWebServer

 

private void createWebServer(){
        WebServer webServer=this.webServer;
        ServletContext servletContext=getServletContext();
        if(webServer==null&&servletContext==null){
        //或WebServer工厂
        ServletWebServerFactory factory=getWebServerFactory();
        //创建Web容器,并且启动Tomcat
        this.webServer=factory.getWebServer(getSelfInitializer());
        //注册正常结束的单例bean
        getBeanFactory().registerSingleton("webServerGracefulShutdown",
        new WebServerGracefulShutdownLifecycle(this.webServer));
        //注册web服务启动时结束的单例bean
        getBeanFactory().registerSingleton("webServerStartStop",
        new WebServerStartStopLifecycle(this,this.webServer));
        }
        else if(servletContext!=null){
        try{
        getSelfInitializer().onStartup(servletContext);
        }
        catch(ServletException ex){
        throw new ApplicationContextException("Cannot initialize servlet context",ex);
        }
        }
        initPropertySources();
        }

createWebServer->getWebServer

  • 创建,配置,初始化并且启动Tomcat容器
  • 代码截图:
  • 在getTomcatWebServer(tomcat)阶段进行了Tomcat的初始化以及启动

registerListeners()

  • 这里主要是对listeners的注册,以及(如果存在早期listeners)广播的发布

protected void registerListeners(){
        // 注册默认静态的listeners
        for(ApplicationListener<?> listener:getApplicationListeners()){
        getApplicationEventMulticaster().addApplicationListener(listener);
        }
        //获取BeanFactory()中与ApplicationListener存在关联的bean的全类名
        String[]listenerBeanNames=getBeanNamesForType(ApplicationListener.class,true,false);
        for(String listenerBeanName:listenerBeanNames){
        getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
        }
        //事件发布
        Set<ApplicationEvent> earlyEventsToProcess=this.earlyApplicationEvents;
        this.earlyApplicationEvents=null;
        //如果早期时间存在,则发布
        if(!CollectionUtils.isEmpty(earlyEventsToProcess)){
        for(ApplicationEvent earlyEvent:earlyEventsToProcess){
        //交由多播器处理
        getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
        }
        }

finishBeanFactoryInitialization(beanFactory);

  • 初始化单例bean
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory){
        // 初始化属性抓换服务
        if(beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)&&
        beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class)){
        beanFactory.setConversionService(
        beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class));
        }
        //是否存在默认的bean值信息解析器(主要用于解析bean的注释信息)
        if(!beanFactory.hasEmbeddedValueResolver()){
        //如果没有则注册一个默认的bean值解析器
        beanFactory.addEmbeddedValueResolver(strVal->getEnvironment().resolvePlaceholders(strVal));
        }
        //初始化LoadTimeWeaverAware的实例bean对象
        String[]weaverAwareNames=beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,false,false);
        for(String weaverAwareName:weaverAwareNames){
        getBean(weaverAwareName);
        }
        //停止使用ClassLoader临时解析bean类名
        beanFactory.setTempClassLoader(null);
        //冻结bean的定义信息,自此bean的定义信息不希望发生变化
        beanFactory.freezeConfiguration();
        // 实例化所有支持非惰性初始化的bean
        beanFactory.preInstantiateSingletons();
        }
  • preInstantiateSingletons
  • FactoryBean:如果一个bean实现了这个接口,它被用作一个对象的工厂来暴露,而不是直接作为一个将自己暴露的bean实例
  • bean的存在有两总形式,一种是作为基础实例存在(只是一个单独存在的bean实例),一种是作为实例工厂存在(实例工厂支持bean创建的多种形式)
  • SmartInitializingSingleton:在BeanFactory引导期间的单例预实例化阶段结束时触发的回调接口.这个接口可以由单例 bean 实现,以便在常规单例实例化算法之后执行一些初始化,避免意外早期初始化(例如来自ListableBeanFactory.getBeansOfType调用)的副作用. 从这个意义上说,** 它是InitializingBean的替代方案,它在bean 的本地构造阶段结束时立即触发**.

 

public void preInstantiateSingletons()throws BeansException{
        if(logger.isTraceEnabled()){
        logger.trace("Pre-instantiating singletons in "+this);
        }
        //加载bean定义的信息
        List<String> beanNames=new ArrayList<>(this.beanDefinitionNames);
        //触发所有非惰性单例bean的初始化
        for(String beanName:beanNames){
        RootBeanDefinition bd=getMergedLocalBeanDefinition(beanName);
        //bean非抽象,非惰性,bean支持单例
        if(!bd.isAbstract()&&bd.isSingleton()&&!bd.isLazyInit()){
        //是否存在bean的复杂加载器
        if(isFactoryBean(beanName)){
        //这里区别
        //如果是普通bean,则是以bean名字作为key
        //如果是复杂加载器,则以"&"+bean的名字作为key
        Object bean=getBean(FACTORY_BEAN_PREFIX+beanName);
        if(bean instanceof FactoryBean){
        FactoryBean<?> factory=(FactoryBean<?>)bean;
        boolean isEagerInit;
        //对FactoryBean进行鉴定,是否支持立即初始化
        //SmartFactoryBean是对FactoryBean的拓展
        //至于这段代码,看不懂
        if(System.getSecurityManager()!=null&&factory instanceof SmartFactoryBean){
        isEagerInit=AccessController.doPrivileged(
        (PrivilegedAction<Boolean>)((SmartFactoryBean<?>)factory)::isEagerInit,
        getAccessControlContext());
        }
        else{
        //默认不希望bean急切的实例化
        isEagerInit=(factory instanceof SmartFactoryBean&&
        ((SmartFactoryBean<?>)factory).isEagerInit());
        }
        //如果bean是FactoryBean且支持急切的实例化,则将bean急切的初始化
        if(isEagerInit){
        getBean(beanName);
        }
        }
        }
        else{
        //如果bean是普通的bean,实例化普通bean
        getBean(beanName);
        }
        }
        }
        //bean初始化后之后的回调操作
        for(String beanName:beanNames){
        Object singletonInstance=getSingleton(beanName);
        if(singletonInstance instanceof SmartInitializingSingleton){
        SmartInitializingSingleton smartSingleton=(SmartInitializingSingleton)singletonInstance;
        if(System.getSecurityManager()!=null){
        AccessController.doPrivileged((PrivilegedAction<Object>)()->{
        smartSingleton.afterSingletonsInstantiated();
        return null;
        },getAccessControlContext());
        }
        else{
        smartSingleton.afterSingletonsInstantiated();
        }
        }
        }
        }

finishRefresh

protected void finishRefresh(){
        //清除此资源加载器中的所有资源缓存
        clearResourceCaches();
        //初始化Lifecycle
        initLifecycleProcessor();
        //根据Lifecycle不同的阶段执行不同的start
        getLifecycleProcessor().onRefresh();
        //对event进行装饰,广播发布所有事件
        publishEvent(new ContextRefreshedEvent(this));
        // Participate in LiveBeansView MBean, if active.
        LiveBeansView.registerApplicationContext(this);
        }
finishRefresh->initLifecycleProcessor
• LifecycleProcessor:用于在ApplicationContext中处理生命周期bean的策略接口
    protected void initLifecycleProcessor(){
        ConfigurableListableBeanFactory beanFactory=getBeanFactory();
        //beanFactory是否存在LIFECYCLE_PROCESSOR_BEAN_NAME的具体实现
        //如果存在key为LIFECYCLE_PROCESSOR_BEAN_NAME的bean
        if(beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)){
        //获取LifecycleProcessor.class的具体实现,并且赋予当前context
        this.lifecycleProcessor=
        beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME,LifecycleProcessor.class);
        if(logger.isTraceEnabled()){
        logger.trace("Using LifecycleProcessor ["+this.lifecycleProcessor+"]");
        }
        }
        //如果beanFactory不存在key为LIFECYCLE_PROCESSOR_BEAN_NAME的LifecycleProcessor.class的具体实现
        else{
        //LifecycleProcessor的默认策略实现
        DefaultLifecycleProcessor defaultProcessor=new DefaultLifecycleProcessor();
        defaultProcessor.setBeanFactory(beanFactory);
        //将当前context的LifecycleProcessor使用默认的DefaultLifecycleProcessor
        //注册默认LifecycleProcessor为单例bean
        this.lifecycleProcessor=defaultProcessor;
        beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME,this.lifecycleProcessor);
        if(logger.isTraceEnabled()){
        logger.trace("No '"+LIFECYCLE_PROCESSOR_BEAN_NAME+"' bean, using "+
        "["+this.lifecycleProcessor.getClass().getSimpleName()+"]");
        }
        }
        }

getLifecycleProcessor().onRefresh()

  • SmartLifecycle:对于ApplicationContext中希望刷新或者以特定顺序关闭的Lifecycle接口的扩展
  • 参数详情:
  • isAutoStartup():对象是否应在上下文刷新时启动
  • 如果此Lifecycle组件应在包含的ApplicationContext被刷新时由容器自动启动,则返回true
  • 值为false表示该组件旨在通过显式Lifecycle.start()调用来启动
  • Phased:指示此Lifecycle组件应启动和停止的阶段.启动过程从最低的相位值开始,以最高的相位值结束;关闭过程将应用相反的顺序
private void startBeans(boolean autoStartupOnly){
        //获取上一阶段的所有LifecycleBean
        Map<String, Lifecycle> lifecycleBeans=getLifecycleBeans();
        Map<Integer, LifecycleGroup> phases=new HashMap<>();
        //遍历所有LifecycleBeans
        lifecycleBeans.forEach((beanName,bean)->{
        //值为false,则显示调用全部Lifecycle
        //返回为true或者只调用bean支持context刷新时启动的Lifecycle
        if(!autoStartupOnly||(bean instanceof SmartLifecycle&&((SmartLifecycle)bean).isAutoStartup())){
        //获取bean的执行的阶段
        int phase=getPhase(bean);
        LifecycleGroup group=phases.get(phase);
        //将LifecycleBean根据执行的阶段来进行分组
        if(group==null){
        group=new LifecycleGroup(phase,this.timeoutPerShutdownPhase,lifecycleBeans,autoStartupOnly);
        phases.put(phase,group);
        }
        group.add(beanName,bean);
        }
        });
        if(!phases.isEmpty()){
        List<Integer> keys=new ArrayList<>(phases.keySet());
        //按照阶段值进行排序
        Collections.sort(keys);
        for(Integer key:keys){
        //通过阶段值的排序执行不同的Lifecycle的start()
        phases.get(key).start();
        }
        }
        }
目录
相关文章
|
6月前
|
存储 芯片
STM32标准库SPI通信协议与W25Q64-1
STM32标准库SPI通信协议与W25Q64
|
6月前
|
存储
【源码共读】dotenv:从 .env 文件中读取环境变量
【源码共读】dotenv:从 .env 文件中读取环境变量
308 1
|
6月前
|
SQL 安全 网络安全
网络安全]sqli-labs Less-12 解题详析
网络安全]sqli-labs Less-12 解题详析
51 0
|
前端开发 安全 数据安全/隐私保护
Linkedin Intro的钓鱼研究
2013年10月28日,我联系了Linkedin的安全团队,并会在近期发布修复补丁来解决下面的问题。这个修复程序适用于随机生成ID的styling规则,同下面介绍的基于class的styling有所区别。
185 0
Linkedin Intro的钓鱼研究
x3d
为何不做一款自己的产品
在这个创意满天飞的年代,为何你没有做出一款自己的产品?好像有个大家都能接受的结论:聪明人太多! 互联网的出现,打破了个人职业生涯原来普遍需要10年行业沉淀和积累的必要条件,是个人都可以成为产品经理,快速迭代、快速试错,一年抵别人10年。
x3d
887 0
|
11天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
15天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
6天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
12天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
7天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。