Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Spring Boot discover but not instantiate a @Component?

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

  1. I move it to com.package i.e. the same as Component1
  2. I declare it as a @Autowired field in com.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?

like image 602
Mark Avatar asked Aug 17 '17 10:08

Mark


People also ask

Does @component create a bean?

No. It is used to explicitly declare a single bean, rather than letting Spring do it automatically. If any class is annotated with @Component it will be automatically detect by using classpath scan. We should use @bean, if you want specific implementation based on dynamic condition.

Can we have 2 classes with @SpringBootApplication?

I have added 2 main classes with @SpringBootApplication.

What is annotation @SpringBootApplication?

Spring Boot @SpringBootApplication annotation is used to mark a configuration class that declares one or more @Bean methods and also triggers auto-configuration and component scanning. It's same as declaring a class with @Configuration, @EnableAutoConfiguration and @ComponentScan annotations.

What happens with @SpringBootApplication?

Spring Boot Auto Configuration automatically configures your Spring application based on the JAR dependencies you added in the project. For example, if MySQL database is on your class path, but you have not configured any database connection, then Spring Boot auto configures an in-memory database.


1 Answers

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.

like image 131
Mark Avatar answered Oct 20 '22 10:10

Mark