нетерпеливо загружать одноэлементный объект в весеннюю загрузку без аннотации - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть служебный класс, который я хочу создать во время загрузки приложения весенней загрузки. Есть ли какое-нибудь возможное место, где я могу вызвать метод getInstance класса для создания объекта?

Следует отметить, что я не могу аннотировать этот класс какой-либо весенней аннотацией, потому что этот класс будет вызываться напрямую, а не вставлятьсяв компоненте пружины. Причина этого заключается в том, что он будет использоваться немного ниже в иерархии по сравнению с компонентом, и я не хочу передавать его от компонента туда, где он должен быть использован. Кроме того, код, где необходимо использовать этот одноэлементный объект, также не может быть аннотирован как устаревший код и будет включать множество изменений.

1 Ответ

1 голос
/ 07 ноября 2019

Прежде всего вы должны решить, хотите ли вы поддерживать этот служебный класс весной (чтобы он отвечал за свой жизненный цикл, мог внедрить экземпляр этого класса в 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, и вы сможете повторно использовать его вне «весенней» части приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...