开发者社区 问答 正文

SpringBoot中,@Order不生效:报错

springboot版本:1.3.5

示例代码如下:

@Configuration
@Order(3)
public class Conf1
{
	@Bean
	public Runnable createRunnable1()
	{
		System.out.println("111");
		return () -> {};
	}
}



@Configuration
@Order(2)
public class Conf2
{
	@Bean
	public Runnable createRunnable2()
	{
		System.out.println("222");
		return () -> {};
	}
}

运行方式:


import org.springframework.boot.SpringApplication;
@SpringBootApplication
public class App6
{
	public static void main(String[] args)
	{
		SpringApplication.run(App6.class, args);
	}
}
按照Order的效果,数字越小,越先初始化

但是,实际上先输出111,再输出了222

两个Order的数字怎么调整,都无效

请问,哪里有问题

展开
收起
kun坤 2020-06-14 07:56:50 1494 分享 版权
阿里云 AI 助理回答

在Spring Boot 1.3.5版本中,你使用的@Order注解可能没有达到预期效果,因为这个注解主要用于排序那些实现了Ordered接口或者被@Component@Service等注解标记的bean。然而,在你的场景中,你是直接在配置类(@Configuration)上使用了@Order来试图控制bean初始化的顺序。

实际上,对于通过@Bean方法定义的bean,Spring Framework并没有直接提供基于@Order的排序机制。@Order在这里可能不会直接影响到bean的初始化顺序,它更多地应用于如过滤器链(Filter)、拦截器(Interceptor)等场景中的组件排序。

如果你希望控制@Bean方法创建的bean的初始化顺序,可以考虑以下几种方式:

  1. 使用@DependsOn注解:你可以让一个bean依赖于另一个bean,这样依赖的bean会先初始化。例如,在需要后初始化的bean上添加@DependsOn("createRunnable1")
@Configuration
public class Conf2 {
    @Bean
    @DependsOn("createRunnable1")
    public Runnable createRunnable2() {
        System.out.println("222");
        return () -> {};
    }
}
  1. 手动控制初始化顺序:直接在配置类中调用另一个配置类中的bean方法,确保按需初始化。
@Configuration
public class Conf1 {
    @Bean
    public Runnable createRunnable1() {
        System.out.println("111");
        return () -> {};
    }
}

@Configuration
public class Conf2 {
    @Autowired
    private Conf1 conf1;

    @Bean
    public Runnable createRunnable2() {
        conf1.createRunnable1(); // 显式调用以确保顺序
        System.out.println("222");
        return () -> {};
    }
}
  1. 重构为单个配置类并控制方法调用顺序:如果逻辑允许,可以将这两个bean合并到一个配置类中,并通过方法调用顺序来控制初始化顺序。

请注意,这些方法都是为了适应特定需求而采取的变通方案。在设计应用时,通常建议减少对bean初始化顺序的硬性依赖,转而通过良好的设计和依赖注入来管理组件之间的关系。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: