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
主要用于排序那些实现了Ordered
接口或者被@Component
、@Service
等注解标记的bean,并且通常与@Priority
一起使用在特定场景下(如过滤器、拦截器)。然而,在你的例子中,@Order
用于配置类上直接控制bean初始化顺序,这并不是它标准的用途。
对于控制Spring Boot中Bean初始化的顺序,一个更合适的方法是利用@DependsOn
注解来明确指定依赖关系。但是,由于你想要的是基于优先级的自动排序,更好的做法是通过实现SmartInitializingSingleton
接口或使用ApplicationListener<ApplicationReadyEvent>
来控制初始化逻辑的执行顺序。
不过,针对你的情况,如果目的是简单地控制打印顺序,可以考虑调整为使用@PostConstruct
注解来显式控制方法的调用顺序。但请注意,这并不改变Bean本身的初始化顺序,而是控制了自定义初始化逻辑的执行时机。
如果你确实需要按特定顺序初始化Bean,可以考虑以下替代方案:
使用Bean工厂后处理器:创建一个自定义的BeanFactoryPostProcessor来根据你的规则手动调整Bean的初始化顺序,但这相对复杂且侵入性较大。
整合Profile和条件化配置:虽然不直接解决排序问题,但可以通过环境Profile或条件化配置(使用@ConditionalOn...
注解)来间接控制哪些Bean在什么条件下被加载,从而变相控制顺序。
修改为使用@Component和@Autowired,结合@DependsOn:将配置类中的@Bean方法移至独立的组件类中,并使用@DependsOn
来显式声明依赖关系。但这种方法需要对现有结构进行较大调整。
考虑到你的需求和Spring Boot 1.3.5的限制,最简单的直接调整可能并不适用。建议评估上述方案,看哪种最适合你的应用场景。如果只是希望按照特定顺序执行一些初始化代码,而非严格控制Bean的实例化顺序,采用事件监听或自定义初始化回调可能是更为简便的方式。