渴望在春季启动时加载没有注释的单例对象

我有一个实用程序类,我想在加载spring boot应用程序时实例化它。有什么地方可以调用类的getInstance方法创建对象?

需要注意的是,我无法使用任何spring注释来注释该类,因为此类将被直接调用并且不会注入spring组件中。这是因为与组件相比,它在层次结构中的使用要少一些,我不想将其从组件传递到需要使用的地方。此外,需要使用此单例对象的代码也不会被注释为遗留代码,并且会涉及很多更改。

lh2009168 回答:渴望在春季启动时加载没有注释的单例对象

首先,您应该确定是否要在春季维护该实用程序类(这样它将负责其生命周期,将此类的实例注入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”部分之外重用它。

本文链接:https://www.f2er.com/3146598.html

大家都在问