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的数字怎么调整,都无效 请问,哪里有问题
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring Boot 1.3.5中,你使用了@Order
注解来控制配置类的加载顺序,但请注意,@Order
注解在配置类(被@Configuration
标记的类)上直接使用并不直接决定Bean的初始化顺序。这个注解主要用于排序那些实现了Ordered
接口或者使用了@PriorityOrdered
注解的组件,比如拦截器、过滤器等。
对于Bean的初始化顺序,Spring Boot主要依据以下原则: 1. 依赖关系:如果一个Bean依赖于另一个Bean,那么被依赖的Bean会先初始化。 2. 自动配置的顺序:Spring Boot的自动配置按照一定的逻辑顺序进行,但这不是通过@Order
直接控制的。 3. 自定义配置类的声明顺序:虽然不推荐作为依赖性管理的主要手段,但在没有其他因素影响的情况下,源代码中的声明顺序有时会影响Bean的初始化顺序。
如果你想要明确控制Bean的初始化顺序,可以考虑以下方法:
@DependsOn
注解:在需要后初始化的Bean上使用@DependsOn
,指定它依赖于哪个Bean。例如,在Conf2
的Bean上添加@DependsOn("createRunnable1")
,这样createRunnable1
就会先于createRunnable2
初始化。@Configuration
public class Conf2 {
@Bean
@DependsOn("createRunnable1")
public Runnable createRunnable2() {
System.out.println("222");
return () -> {};
}
}
利用Bean工厂PostProcessor:更复杂的场景下,可以通过实现BeanFactoryPostProcessor
接口来进一步控制Bean的创建过程和顺序。
调整配置类的加载顺序:虽然直接用@Order
在配置类上可能不会按预期工作,但确保配置类本身的加载顺序(通过它们的声明顺序或模块的组织方式)有时也能间接影响到Bean的初始化顺序。
由于你的需求是基于特定版本的Spring Boot,上述建议是在不升级框架版本基础上的解决方案。如果条件允许,升级到较新版本的Spring Boot可能会提供更灵活的配置管理功能。