我有一个实用程序类,我想在加载spring boot应用程序时实例化它。有什么地方可以调用类的getInstance方法创建对象?
需要注意的是,我无法使用任何spring注释来注释该类,因为此类将被直接调用并且不会注入spring组件中。这是因为与组件相比,它在层次结构中的使用要少一些,我不想将其从组件传递到需要使用的地方。此外,需要使用此单例对象的代码也不会被注释为遗留代码,并且会涉及很多更改。
答案 0 :(得分:1)
首先,您应该确定是否要在春季维护该实用程序类(这样它将负责其生命周期,将此类的实例注入bean中并强制使用)。
如果要使此类完全变为“未知”类,则可以在spring中创建一个事件侦听器,该事件侦听器将在启动应用程序上下文时由spring调用。可以在任何包含主类的item.IsRead = true; item.ModifiedDate = DateTime.Now;
类中完成(用@Configuration
注释,这也是一个重要的配置):
@SpringBootApplication
另一种选择是在触发spring boot加载之前,将行@EventListener
public void onApplicationStarted(ApplicatationReadyEvent evt) {
UtilClass.INSTANCE(); // instantiate whatever
}
放在方法main中。在这种情况下,它甚至会在弹簧完全开始之前加载。
现在,如果您确实想用spring来管理它,这意味着您有一个像这样的bean:
UtilClass.INSTANCE()
在这种情况下,假设您不想在@Component
public class MySampleBean {
@Autowired // better constructor injection, but not relevant for this question
private UtilClass utilClass;
public void foo() {
...
utilClass.doSomething();
...
}
}
上放置任何弹簧注释,则可以执行以下操作:
UtilClass
在这种情况下会发生以下情况:
Spring通过调用此方法来创建类型为 @Configuration
public class MySpringConfiguration {
@Bean
public UtilClass utilClass() {
return UtilClass.INSTANCE();
}
}
的bean。但是,此方法作为常规的Java代码将返回相同的单例实例。因此,Spring将“知道”该bean(它将存储在Application Context中,但是它与单例实例相同,因此您可以在应用程序的“ spring”部分之外重用它。