Spring @Component порядок создания - PullRequest
1 голос
/ 13 апреля 2020

Я пытался найти ответ на вопрос выше, но не смог. Итак, что такое порядок создания Spring @Component? Например: у нас есть

@Component
public class Foo extends SecondClass {
   private SomeType someField;

   @Autowired
   public Foo(SomeType someField){
    super(someField);
   }
}

public class SecondClass implement ISomething {
  //code and @override methods...
  @PostConstruct 
  public void method(ISomething i) {
    //Actions with i
  }
}

Какой будет порядок создания? Что будет создано первым, родительским или дочерним в данном конкретном случае? Спасибо ..

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Для простоты игнорируйте компоненты, которые будут созданы в фоновом режиме как часть приложения Spring.

Поскольку у вас есть @Component только для класса Foo, будет создан один компонент Spring. Не имеет значения порядок создания, потому что здесь создается только один компонент, поскольку у вас нет @Component ни в одном другом классе. Вам придется вручную создать экземпляр SecondClass, если вы хотите его использовать.

Что касается вопроса о наследовании, Spring не занимается этим. Об этом позаботится сама Java.

edit:

@PostConstruct будет игнорироваться, потому что SecondClass не является бином Spring. Но так как мы используем super, он будет называться Это полная программа, которая проверяет порядок создания бина.

import javax.annotation.PostConstruct;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class TestProgram implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(TestProgram.class, args);
    }

    @Component
    public static class Foo extends SecondClass {
        @Override
        public void method() {
            System.out.println("Printing Foo class");
            //new change
            super.method(); 
        }
    }

    public static class SecondClass implements Cloneable {
        //Since you are calling this method via super in Foo class, you don't need 
        //this annotation as it is being ignored anyway since this class is not a 
        //bean.
        @PostConstruct
        public void method() {
          System.out.println("Printing Second Class");
        }
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Spring application is up.");
    }
}

Он будет печатать оба сейчас, так как мы используем супер вызов для вызова SecondClass метода.

Печать класса Foo

Печать второго класса

Вам не нужен @PostConstruct в SecondClass, поскольку это не бин Spring, и поэтому он игнорировался без вызова super.

Поиграйте, удалив / добавив аннотации, и вы получите это.

1 голос
/ 13 апреля 2020

Аннотация @Order определяет порядок сортировки аннотированного компонента или компонента. Он имеет необязательный аргумент-значение, определяющий порядок компонента. Так что вы можете расположить компонент в соответствии с его приоритетом.

...