Как я могу @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, который вы определили.