Spring Boot abstract @Autowired of Service not working

I am trying to use the @Autowired annotation for the Service class in a Spring Boot application, but it continues to throw a No qualifying bean of type exception. However, if I change the class of service to bean, then it works fine. This is my code:

 package com.mypkg.domain; @Service public class GlobalPropertiesLoader { @Autowired private SampleService sampleService; } package com.mypkg.service; @Service public class SampleService{ } 

And this is my SpringBoot class:

 package com.mypkg; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; @SpringBootApplication @EnableJpaRepositories @Import(RepositoryRestMvcConfiguration.class) @EnableTransactionManagement public class TrackingService { private static final Logger LOGGER = LoggerFactory.getLogger(TrackingService.class); static AnnotationConfigApplicationContext context; public static void main(String[] args) throws Exception { SpringApplication.run(TrackingService.class, args); context = new AnnotationConfigApplicationContext(); context.refresh(); context.close(); } } 

When I try to run this, I get the following exception:

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mypkg.service.SampleService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

But when I @Service annotation from the SampleService class and add it as a bean to my AppConfig class, as shown below, it works fine:

 @Configuration public class AppServiceConfig { public AppServiceConfig() { } @Bean(name="sampleService") public SampleService sampleService(){ return new SampleService(); } } 

Classes are in different packages. I do not use @ComponentScan . Instead, I use @SpringBootApplication , which does this automatically. However, I also tried with ComponentScan, but that did not help.

What am I doing wrong here?

+7
spring spring-boot spring-mvc annotations
source share
1 answer

You use two ways to build a Spring bean. You just need to use one of them.

  • @ Services over POJO

     @Service public class SampleService 
  • @Bean in a configuration class to be annotated with @Configuration

     @Bean public SampleService sampleService(){ return new SampleService(); } 

@Autowired is allowed by class type, then @Bean(name="sampleService") not needed, you only have one bean with this class type.

EDIT 01

package com.example

 @SpringBootApplication public class Application implements CommandLineRunner { public static void main(String... args) { SpringApplication.run(Application.class); } @Autowired private UserRepository userRepository; @Autowired private UserService userService; @Override public void run(String... strings) throws Exception { System.out.println("repo " + userRepository); System.out.println("serv " + userService); } } 

package com.example.config

 @Configuration public class AppConfig { @Bean public UserRepository userRepository() { System.out.println("repo from bean"); return new UserRepository(); } @Bean public UserService userService() { System.out.println("ser from bean"); return new UserService(); } } 

package com.example.repository

 @Service public class UserRepository { @PostConstruct public void init() { System.out.println("repo from @service"); } } 

package com.example.service

 @Service public class UserService { @PostConstruct public void init() { System.out.println("service from @service"); } } 

Using this code, you can comment on the AppConfig class, and then you can authorize UserRepository and UserService. After that, the @Service comment in each class and uncomment AppConfig and classes will also be auto-level.

+15
source share

All Articles