#java #spring #spring-mvc #inversion-of-control #ioc-container
Вопрос:
У меня есть этот урок:
@Service
public class DogUserService {
private final ManagerService managerService;
...
}
и на моем context.xml:
<bean id="managerService"
class="com.dogs.impl.services.ManagerService" />
но когда я запускаю приложение. У меня есть эта ошибка:
rvice.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'com.dogs.impl.services.ManagerService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency a
nnotations: {}
Ответ №1:
Вам необходимо предоставить компонент с помощью аннотации @Bean в WebApplicationContext. Я создал компонент ManagerService из context.xml в компоненте @Configuration и сделал компонент доступным в WebApplicationContext с помощью метода @Bean. Этот класс UserService, у которого есть служба управления в качестве автоматического подключения, имеет свойство @ConditionalOnBean для этого компонента конфигурации.
Ниже показано, как я это реализовал.
Класс приложения
@SpringBootApplication public class DemoApplication
{
public static void main(String[] args)
{
SpringApplication.run(DemoApplication.class, args);
}
}
Обслуживание пользователей
@Service
@ConditionalOnBean({EnableConfiguration.class})
public class UserService
{
@Autowired
private ManagerService managerService;
public String run() {
System.out.println("Going to Run from manager Service");
return managerService.run();
}
}
Включение конфигурации
@Configuration
public class EnableConfiguration implements InitializingBean
{
ManagerService managerService;
@Bean
public ManagerService mngrService() {
return managerService;
}
@Override public void afterPropertiesSet() throws Exception
{
ApplicationContext ctx = new ClassPathXmlApplicationContext( "context.xml" );
managerService = (ManagerService) ctx.getBean("managerService");
System.out.println("manager bean:" managerService.toString());
mngrService();
}
}
Служба менеджеров
public class ManagerService
{
private int a;
private int b;
public ManagerService(int a, int b) {
this.a = a;
this.b = b;
}
public String run() {
return this.toString();
}
@Override public String toString()
{
return "ManagerService{" "a=" a ", b=" b '}';
}
}
Сервисный контролер
@RestController
public class ServiceController
{
@Autowired
private UserService userService;
@GetMapping("/get")
public String test() {
return userService.run();
}
}
context.xml
<bean id="managerService" class="com.example.demo.ManagerService">
<constructor-arg index="0" value="2"/>
<constructor-arg index="1" value="5"/>
</bean>