Java Spring:确保首先初始化特定的bean
我有一个库在运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经向spring提交,以支持初始化顺序,但我想知道是否有一种方法可以将一个bean标记为spring容器初始化的第一个bean?这是一个请求但未解决的功能。您可以使用dependens,但它太冗长了。有关更多信息,请访问tis链接: 您的选择包括:Java Spring:确保首先初始化特定的bean,java,spring,Java,Spring,我有一个库在运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经向spring提交,以支持初始化顺序,但我想知道是否有一种方法可以将一个bean标记为spring容器初始化的第一个bean?这是一个请求但未解决的功能。您可以使用dependens,但它太冗长了。有关更多信息,请访问tis链接: 您的选择包括: 使用annot
main()
方法或ServletContextListener
在Spring中无法明确定义初始化顺序,而且可能永远也无法明确定义——考虑到您可以加载许多可能有冲突顺序的应用程序上下文配置文件,因此无法为其定义有用的语义。我还没有看到通过重构代码以更好地符合依赖注入模式而无法实现所需排序的情况。您可以在主@Configuration中@Autowired一个@Configuration
@Configuration
@Import(BusinessConfig.class, EarlyBeans.class)
public class MainConfiguration {
// The bean defined in EarlyBean will be loaded before
// most beans references by MainConfiguration,
// including those coming from BusinessConfig
@Autowired
EarlyBeans earlyBeans;
}
@Configuration
public class EarlyBeans {
@Bean
public Void earlyBean(ApplicationContext appContext) {
// .getBeansOfType allows to call for beans which might not exist
appContext.getBeansOfType(TechnicalBean.class);
return null;
}
}
您可以将应用程序上下文拆分为多个,并在主应用程序上下文中使用导入。您可以先按导入顺序放置主环境设置,然后继续添加其他文件 它可能像下面这样
<!-- Import environment properties settings. -->
<import resource="Spring-Env.xml"/>
<!-- Import All the other Application contexts. -->
<import resource="Spring-MainApplicationContext.xml"/>
看看这篇文章,您可能希望无论如何都包括log4j.properties,至少对于Spring启动,在Spring初始化您的日志bean之前,它将使用其内部日志记录的默认值,通常,如果您使用的是log4j,这将是在类路径上定义的log4j.properties文件。这个文件不必非常复杂-通常它可以简单地输出到控制台,因为如果应用程序成功启动,有意义的日志记录将通过您的自定义bean进行。我在某种程度上实现了第三个选项,但这意味着我首先在spring之外显式初始化logger。我的偏好是让大多数对象的生命周期由spring管理,但我理解你的观点,即一个好的设计模式应该能够处理它。@Prasanna如果你想让大多数对象由spring管理,你肯定也应该在spring中管理记录器,或者将记录器创建封装在记录器工厂中,并将其注入到其他类中。如果您想支持使用LogManager
静态方法检索记录器,那么您必须使用选项3–因为LogManager是一个(专门的)对象工厂,不能由Spring合理管理。@Inerida,是的,LogManager是问题所在,我没有看到除3之外的任何其他选项,我使用@DependsOn({“anotherBean”})
@prayagupd-你是我们所有人的英雄,因此你的努力会更好。你根本不需要我的许可,我想问一下会减少我回家时忘记它的风险非常有用,只有一条评论-一条@Import(EarlyBeans.class)或者@Autowired EarlyBeans EarlyBeans;就足以让它工作了。很抱歉评论了一个老问题-这与调用appContext.getBeansOfType(TechnicalBean.class)
或者在主配置本身内部使用@Autowired TechnicalBean
有何不同?