问题
I have a Spring Boot application with the following structure
com.package
Application - annotated with @SpringBootApplication
Configuration - annotated with @Configuration
Component1 - annotated with @Component, constructor annotated with @Autowired
com.package.subpackage
Component2 - annotated with @Component, constructor annotated with @Autowired
My application class is
package com.package;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
When I start the application both Component1
and Component2
are identified as candidate components. However, only Component1
is instantiated.
Component2
will only instantiate when I make either of the following changes
- I move it to
com.package
i.e. the same asComponent1
- I declare it as a
@Autowired
field incom.package.Configuration
Why does Spring Boot discover the component but not instantiate it in this case? Are there differences in how @ComponentScan
works with regards to discovering vs instantiating @Component
?
回答1:
In my case it was not an issue with Spring Boot itself.
The @PostConstruct
method for Component1
was blocking the main thread hence Component2
was not initialised.
Using @Autowired
or moving to the same package obviously triggered the @PostConstruct
method of Component2
before Component1
.
来源:https://stackoverflow.com/questions/45733297/why-does-spring-boot-discover-but-not-instantiate-a-component