Springboot加载所有Bean之后运行方式

 更新时间:2024年07月18日 11:25:34   作者:ldy夏沫  
这篇文章主要介绍了Springboot加载所有Bean之后运行方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Springboot加载所有Bean之后运行方式

Springboot启动后,需要加载一些配置文件至内存中

方法

编写普通类,继承ApplicationListener,重写onApplicationEvent方法

@Component
@Slf4j
public class InitTaskListener implements ApplicationListener<ContextRefreshedEvent> {

@SneakyThrows
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("所有bean加载完之后开始执行....");
    }

}

Springboot中Bean的加载顺序

一、为什么要控制

当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成自动装配时。

你会声明自己的Configuration类,但是可能你面对的是好几个有互相依赖的Bean。

如果不加以控制,这时候可能会报找不到依赖的错误,这个时候需要通过一些手段来控制springboot中的bean加载顺序。

二、怎么控制

@DependsOn

@DependsOn注解可以用来控制bean的创建顺序,该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。

与@Component或@Bean配合使用 

demo

@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component(value = "EventSource")
    public class EventSource {
        public EventSource(){
            System.out.println("事件源创建");
        }
    }
    /**
     * 监听类
     */
    @Component
    @DependsOn(value = {"EventSource"})
    public class EventTListener {

        public EventTListener(){
            System.out.println("监听器创建");
        }
    }
}

参数注入

package com.sinosoft.springbootplus.test.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

/**
 * @author lsh
 * @date 2022/2/25
 */
@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("事件事件");
        }
    }
    
    @Component
    public class EventSource{
        public EventSource(Event e){
            System.out.println("事件源创建");
        }
    }


    @Component
    public class EventTListener {

        public EventTListener(){
            System.out.println("监听器创建");
        }
    }
}

利用bean的生命周期中的扩展点

@AutoConfigureOrder

@AutoConfigureOrder只能改变外部依赖的@Configuration的顺序。

这是不对的用法

@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component
    @AutoConfigureOrder(1)
    public class Event{
        public Event(){
            System.out.println("事件事件");
        }
    }

    @Component
    @AutoConfigureOrder(2)
    public class EventSource{
        public EventSource(Event e){
            System.out.println("事件源创建");
        }
    }


    @Component
    @AutoConfigureOrder(3)
    public class EventTListener {

        public EventTListener(){
            System.out.println("监听器创建");
        }
    }
}

以上内容发现,在config里配置是不起作用的。

这是正确的用法

创建两个配置类

@Slf4j
@Configuration
@AutoConfigureOrder(1)
public class SpringConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("首先在SpringConfig");
        }
    }

}


@Slf4j
@Configuration
@AutoConfigureOrder(2)
public class NewConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("然后在NewConfig");
        }
    }
}

测试

发现结果是不正确的,注解还是没有生效。

当前工程里增加配置 META-INF/spring.factories,内容为项目中的配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sinosoft.springbootplus.common.config.NewConfig,com.sinosoft.springbootplus.common.config.SpringConfig

测试结果如图(正确)

三、遇到的问题

1、需要根据配置决定生成哪个实现类。

当在配置文件中配置的dict.cacheType的值是local时,初始化LocalISysDictRepository交给spring容器管理;当项目依赖了redis并且配置文件中配置的dict.cacheType的值是redis时,初始化RedisISysDictRepository交给spring容器管理。

2、但是我又在这两个实现类上加了@Repository注解,也要交给Spring管理,这个时候项目启动就报错了。(通俗的来说一个类只能一次交给Spring管理)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA 隐藏DEBUG日志的解决方法

    IDEA 隐藏DEBUG日志的解决方法

    IDEA 打印太多的DEBUG日志,看起来很烦,有没有办法隐藏日志,网上找了一圈,没有谁写的靠谱的,下面小编给大家分享下IDEA 如何隐藏DEBUG日志,需要的朋友可以参考下
    2022-09-09
  • maven加入spring框架的详细教程

    maven加入spring框架的详细教程

    这篇文章主要介绍了maven加入spring框架的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot集成swagger3.0指南分享

    SpringBoot集成swagger3.0指南分享

    本文介绍了如何在Spring Boot项目中集成Swagger 3.0,包括添加依赖、配置Swagger、在Controller上添加注解以及配置访问权限
    2024-11-11
  • Java String类的理解及字符串常量池介绍

    Java String类的理解及字符串常量池介绍

    这篇文章主要介绍了Java String类的理解及字符串常量池介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • mybatis resultmap 如何为对象赋值的调用顺序

    mybatis resultmap 如何为对象赋值的调用顺序

    这篇文章主要介绍了mybatis resultmap 如何为对象赋值的调用顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot实现上传并解析Excel过程解析

    springboot实现上传并解析Excel过程解析

    这篇文章主要介绍了springboot实现上传并解析Excel过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题

    java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题

    这篇文章主要为大家介绍了java图论弗洛伊德算法和迪杰斯特拉算法解决最短路径的问题示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Spring interceptor拦截器配置及用法解析

    Spring interceptor拦截器配置及用法解析

    这篇文章主要介绍了Spring interceptor拦截器配置及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 深入理解Java抽象类

    深入理解Java抽象类

    这篇文章主要介绍了Java抽象类的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • SpringBoot访问请求404解决方法

    SpringBoot访问请求404解决方法

    这篇文章主要介绍了SpringBoot访问请求404解决方法,文中有详细的解决方法供大家参考,对我们学习或工作有一定的帮助,需要的朋友跟着小编一起来学习吧
    2023-07-07

最新评论