Как я могу @Autowire spring bean, который был создан из внешней банки?
У меня есть модуль /jar, который я создал и использую в качестве библиотеки . Я создал службу там так:
@Service
public class PermissionsService { ... }
... где это находится в пакете здесь: com.inin.architect.permissions, и в моем основном приложении я ссылаюсь/загружаю эту банку (т.е. устанавливаю как зависимость в maven POM.xml для приложения):
<dependency>
<groupId>com.inin.architect</groupId>
<artifactId>permissions</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
и в приложении я хочу использовать эту службу, например:
@Autowired
PermissionsService permissions
В приложении spring у меня есть это:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }
Однако, когда я запускаю свое приложение под tomcat, он жалуется, что для PermissionsService не существует bean: "org.springframework.beans.factory.NoSuchBeanDefinitionException: нет квалификационного bean типа..."
Итак, как я могу использовать bean из lib в мое приложение? Конечно, есть способ. Вам нужно установить библиотеку как полномасштабное приложение spring MVC, чтобы это могло работать? т.е. вам нужно настроить @Configuration и @ComponentScan в lib?
Ответы
Ответ 1
Вам нужно сканировать хотя бы пакет, содержащий класс, который вы хотите ввести. Например, с помощью Spring 4 аннотации:
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
Это тот же самый принцип для конфигурации XML.
Ответ 2
Просто обратите внимание на это, но вы можете отделить свою зависимость от spring. В классе @Configuration
создайте
@Bean public PermissionsService permissionsService(){
return new PermissionsService()
}
Это также позволит впрыснуть. Не то, что вам нужно удалить аннотацию spring, просто вариант, делающий ее потенциально пригодной для использования вне spring.
Ответ 3
Вы можете импортировать application-context.xml для com.inin.architect.permissions следующим образом внутри основного приложения.
<import resource="classpath:/permissionApplicationContext.xml" />
Это позволит вам autwire beans из com.inin.architect.permissions, который вы определили.