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