Spring Boot Annotation @Autowired of Service 失败 [英] Spring Boot Annotation @Autowired of Service fails
问题描述
我正在尝试对 Spring Boot 应用程序中的服务类使用 @Autowired
注释,但它不断抛出 Noqualifying bean of type
异常.但是,如果我将服务类更改为 bean,则它可以正常工作.这是我的代码:
I'm trying to use @Autowired
annotation for a Service class in Spring Boot application, but it keeps throwing No qualifying bean of type
exception. However, if I change the service class to a 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{
}
这是我的 SpringBoot 类:
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)}
但是,当我从 SampleService 类中删除 @Service
注释,并将其作为 bean 添加到我的 AppConfig 类中时,如下所示,它工作正常:
But when I remove the @Service
annotation from the SampleService class, and add it as a bean in my AppConfig class as below, it works fine:
@Configuration
public class AppServiceConfig {
public AppServiceConfig() {
}
@Bean(name="sampleService")
public SampleService sampleService(){
return new SampleService();
}
}
这些类位于不同的包中.我没有使用 @ComponentScan
.相反,我使用 @SpringBootApplication
自动执行此操作.但是,我也尝试过 ComponentScan,但这没有帮助.
The classes are in different packages. I am not using @ComponentScan
. Instead, I'm using @SpringBootApplication
which does that automatically. However, I tried with ComponentScan as well but that didn't help.
我在这里做错了什么?
推荐答案
您正在使用两种方法来构建 Spring 的 bean.您只需要使用其中之一即可.
You are using two ways to build a Spring's bean. You just need to use one of them.
@Service
POJO
@Service
public class SampleService
配置类中的
@Bean
必须用@Configuration
@Bean
public SampleService sampleService(){
return new SampleService();
}
@Autowired
由类类型解析然后 @Bean(name=sampleService")
是不需要的,因为您只有一个具有该类类型的 bean.
@Autowired
is resolved by class type then @Bean(name="sampleService")
is not needed is you have only one bean with that class type.
编辑 01
包com.example
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);
}
}
包 com.example.config
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();
}
}
包 com.example.repository
package com.example.repository
@Service
public class UserRepository {
@PostConstruct
public void init() {
System.out.println("repo from @service");
}
}
包 com.example.service
package com.example.service
@Service
public class UserService {
@PostConstruct
public void init() {
System.out.println("service from @service");
}
}
使用此代码,您可以注释 AppConfig
类,然后您将看到 UserRepository
和 UserService
是如何自动装配的.在每个类中注释 @Service
并取消注释 AppConfig
之后,类也将自动装配.
Using this code you can comment the AppConfig
class and then you will see how UserRepository
and UserService
are autowired. After that comment @Service
in each class and un-comment AppConfig
and classes will be autowired too.
这篇关于Spring Boot Annotation @Autowired of Service 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!