springboot中bean的加载顺序问题
作者:华妃 发布时间:2022-01-04 19:55:57
标签: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
测试结果如图(正确)
三、遇到的问题
需要根据配置决定生成哪个实现类
当在配置文件中配置的dict.cacheType的值是local时,初始化LocalISysDictRepository交给spring容器管理;
当项目依赖了redis并且配置文件中配置的dict.cacheType的值是redis时,初始化RedisISysDictRepository交给spring容器管理。
但是我又在这两个实现类上加了@Repository注解
也要交给Spring管理,这个时候项目启动就报错了。(通俗的来说一个类只能一次交给Spring管理)
来源:https://blog.csdn.net/weixin_44792849/article/details/123116593
0
投稿
猜你喜欢
- 所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。下面看
- 本文主要为大家整理Java常见的面试题,供大家参考,具体内容如下1. Java中sleep和wait的区别① 这两个方法来自不同
- 开篇语Synchronized,Java 友好的提供了的一个关键字,它让开发者可以快速的实现同步。它就像一个星星,远远看去就是一个小小的点。
- 本文实例讲述了java实现新浪微博Oauth接口发送图片和文字的方法。分享给大家供大家参考。具体如下:基于网上很多人利用新浪api开发新浪微
- Java Set集合的遍历及实现类的比较Java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法package
- 在 Flutter 中使用图片是最基础能力之一。作为春节开工后的第一篇文章,17 做了精心准备,满满的都是干货!本文介绍如何在 Flutte
- 本文实例为大家分享了java图形用户界面实现菜单功能的具体代码,供大家参考,具体内容如下题目:编写一个图形用户界面,实现菜单的功能。有3个一
- 一、Optional类的来源到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公
- final关键字的作用final关键字可以用来修饰引用、方法和类。1.final关键字修饰类当用final关键字修饰一个类后,这个类不能被继
- 本文主要介绍的是通过使用java的相关类可以实现对文件或文件夹的压缩。zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据
- ErrorPageFilter的实际应用Spring框架错误页过滤器springboot提供了一个ErrorPageFilter,用来处理当
- 前言比较运算符用于判断两个数据的大小,例如:大于、等于、不等于。比较的结果是一个布尔值( true 或 false )。Java 中常用的比
- spring in action第三版读书笔记spring3.0引入了spring expression language(spel)语言,
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基
- 安装 Tomcat 之前请一定先安装 Java ,然后才能安装 Tomcat 。安装 Java 、环境变量 path 的设置以及 cmd 小
- 1.登录腾讯云点击登录选择浏览器登录。输入用户名 按回车键 然后输入 密码。2.安装java环境直接命令:yum -y install ja
- Bitmap (android.graphics.Bitmap)Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像
- 一、简介ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- java 获取字节码文件的几种方法总结在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式,其具体思想及代码如下所示:pu