我正在处理几个春季问题(通常涉及春季安全问题,但也涉及此问题的标签中提到的其他技术)@Configuration
命令,其中某些内容已初始化并且#34;太早"或者"太晚了#34;。
举个例子:When customizing Tomcat: A ServletContext is required to configure default servlet handling
答案通常是为某些bean创建单独的@Configuration
文件,然后它开始工作。我得到的错误(堆栈跟踪)的性质通常不会响起,这可能是我的错!)
有人可以指出我在哪里可以找到有关为什么创建单独的@Configuration
类帮助以及如何确定@Configuration
类的顺序的信息?
任何有关如何在堆栈跟踪中查看以识别此类问题的提示也将非常感激。
答案 0 :(得分:1)
它有时帮助的原因是因为它为bean创建顺序提供了Spring替代选项。查看它的一种(过度)简化方式是,如果将所有内容放在一个文件中,则顺序由文件内容决定。然而,如果你打破它,那么Spring可以探索其他选项,而事情可以在另一个更合适的订单中落实到位。请注意,您可以为@Configuration
使用内部类和包受保护的类(只要它们是静态的),因此您不需要创建新文件。
@Configuration
课程也可能是自相矛盾的(例如,您希望@Autowired
在同一单元中创建的内容 - 有时它可以工作,有时不会。此外,在这些情况下,通常需要尽早实例化Spring(不是由您自己的代码显式)创建的组件。 Spring Boot必须通过在Servlets
完全初始化之前创建Filters
和ServletContext
来加剧这种情况。
就堆栈跟踪而言,@Autowired
依赖关系结果为空是一种气味。同样在日志中,您可能会看到INFO级别日志,说某些bean没有资格进行后期处理'。这不能保证是致命的(因此是INFO级别),但如果你看到很多,你可能会遇到麻烦。
我不知道这种推理的任何规范性参考。