开发者社区 问答 正文

SpringBoot中,@Order不生效 - java报错

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的数字怎么调整,都无效

请问,哪里有问题

展开
收起
montos 2020-06-03 10:23:47 1240 分享 版权
阿里云 AI 助理回答

在Spring Boot 1.3.5版本中,你使用的@Order注解可能没有达到预期效果,因为@Order主要用于排序那些实现了Ordered接口或者被@Component@Service等注解标记的bean,并且通常与@Priority一起使用在特定场景下(如过滤器、拦截器)。然而,在你的例子中,@Order用于配置类上直接控制bean初始化顺序,这并不是它标准的用途。

对于控制Spring Boot中Bean初始化的顺序,一个更合适的方法是利用@DependsOn注解来明确指定依赖关系。但是,由于你想要的是基于优先级的自动排序,更好的做法是通过实现SmartInitializingSingleton接口或使用ApplicationListener<ApplicationReadyEvent>来控制初始化逻辑的执行顺序。

不过,针对你的情况,如果目的是简单地控制打印顺序,可以考虑调整为使用@PostConstruct注解来显式控制方法的调用顺序。但请注意,这并不改变Bean本身的初始化顺序,而是控制了自定义初始化逻辑的执行时机。

如果你确实需要按特定顺序初始化Bean,可以考虑以下替代方案:

  1. 使用Bean工厂后处理器:创建一个自定义的BeanFactoryPostProcessor来根据你的规则手动调整Bean的初始化顺序,但这相对复杂且侵入性较大。

  2. 整合Profile和条件化配置:虽然不直接解决排序问题,但可以通过环境Profile或条件化配置(使用@ConditionalOn...注解)来间接控制哪些Bean在什么条件下被加载,从而变相控制顺序。

  3. 修改为使用@Component和@Autowired,结合@DependsOn:将配置类中的@Bean方法移至独立的组件类中,并使用@DependsOn来显式声明依赖关系。但这种方法需要对现有结构进行较大调整。

考虑到你的需求和Spring Boot 1.3.5的限制,最简单的直接调整可能并不适用。建议评估上述方案,看哪种最适合你的应用场景。如果只是希望按照特定顺序执行一些初始化代码,而非严格控制Bean的实例化顺序,采用事件监听或自定义初始化回调可能是更为简便的方式。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答