Прежде всего вы должны решить, хотите ли вы поддерживать этот служебный класс весной (чтобы он отвечал за свой жизненный цикл, мог внедрить экземпляр этого класса в bean-компоненты и таким образом принудительно).
Если вы хотите сделать этот класс «неизвестным» для пружин вообще, вы можете создать прослушиватель событий весной, который будет вызываться весной при запуске контекста приложения. Это можно сделать в любом классе @Configuration
, включая основной класс (помеченный @SpringBootApplication
, который также является конфигурацией под капотом):
@EventListener
public void onApplicationStarted(ApplicatationReadyEvent evt) {
UtilClass.INSTANCE(); // instantiate whatever
}
Другой вариант - просто поместить строку UtilClass.INSTANCE()
в методе main, прежде чем запускать загрузку пружинной загрузки. В этом случае он будет загружаться даже раньше, чем начнется весна.
Теперь, если вы хотите управлять им с помощью пружины, это означает, что у вас есть где-то боб:
@Component
public class MySampleBean {
@Autowired // better constructor injection, but not relevant for this question
private UtilClass utilClass;
public void foo() {
...
utilClass.doSomething();
...
}
}
Inв этом случае, если вы не хотите помещать какие-либо весенние аннотации на UtilClass
, вы можете сделать следующее:
@Configuration
public class MySpringConfiguration {
@Bean
public UtilClass utilClass() {
return UtilClass.INSTANCE();
}
}
Вот что происходит в этом случае:
Spring создает bean-компонент типа UtilClass
, вызывая этот метод. Но этот метод как обычный код Java возвращает тот же экземпляр синглтона. Таким образом, Spring будет «знать» этот bean-компонент (он будет храниться в контексте приложения, однако это будет тот же экземпляр, что и в singleton, и вы сможете повторно использовать его вне «весенней» части приложения.