Как создать боб из банки во внешнем каталоге - PullRequest
0 голосов
/ 02 мая 2020

У меня есть базовое c весеннее приложение, которое просто загружает боб и все. Я знаю, что в рамках проекта я могу использовать аннотацию @Component внутри класса, чтобы пометить его как компонент, и приложение Spring найдет его и будет действовать соответствующим образом.

Однако в настоящее время я пытаюсь разместить компонент в jar, т.е. plugin.jar во внешнем каталоге /Users/me/plugin.jar. Я не знаю, как заставить весну искать в этой банке аннотированный класс вместо локального пакета. Возможно ли это вообще?

Я хочу иметь возможность загружать bean-компонент из jar без включения jar в путь к классу, а просто искать в каталоге jar и динамически создавать bean-компонент на основе любых данных. Jar находится там.

Я использовал Java отражение и URLClassLoader для динамической загрузки классов из jar, но не могу понять, как сделать то же самое в Spring. Любая помощь или указания о том, как начать работу, очень ценится. Спасибо!

Дополнительная информация: Приложение Spring должно быть спроектировано таким образом, чтобы во время работы оно сканировало назначенный каталог на наличие любых jar-файлов и, если оно находило jar-файл, создавало бин из одного из классов внутри. Я не могу узнать, как заставить приложение Spring выполнять поиск в указанном каталоге для поиска файлов jar для использования в качестве компонентов. Все, что я нахожу, просто ссылается на классы внутри проекта.

Ответы [ 4 ]

1 голос
/ 02 мая 2020

Вы можете создать Конфигурацию, в которой вы инициируете требуемый компонент от внешнего jar.

 @Configuration
    public class AppConfig {

        @Bean
        public MyBean myBean() {
            return new YourExternalClassName();
        }

    }
0 голосов
/ 02 мая 2020

Однако в настоящее время я пытаюсь поместить компонент в jar, т.е. plugin.jar, во внешний каталог /Users/me/plugin.jar. Я не знаю, как заставить весну искать в этой банке аннотированный класс вместо локального пакета. Это вообще возможно?

Вы можете добавить JAR в путь к классу приложения во время выполнения. Но проблема в том, что во время компиляции вам также необходимо иметь jar в качестве зависимости компиляции.
Поскольку вы используете Spring Boot, это означает, что вы используете Maven или Gradle в качестве инструмента для сборки.
В этом случае вы не используете не нужно использовать локальные каталоги для указания ваших внешних jar-файлов, иначе ваши сборки будут воспроизводиться только на вашем компьютере и в очень специфическом c состоянии вашего компьютера (jar-файл должен находиться в указанном каталоге). Вы не хотите игнорировать преимущества инструмента сборки.
Более надежный способ - применить способ maven / gradle:
- определить эту банку как артефакт maven / gradle
- pu sh для вашего репо (локального и центрального, если вы его используете)
- объявите jar в зависимостях pom.xml / build.gradle вашего приложения

Тогда в вашем приложении вы можете объявить bean-компонент класса Foo, определяющего в JAR, например:

@Configuration
public class ExternalBeanConfig {

        @Bean
        public Foo foo() {
            return new Foo();
        }

}
0 голосов
/ 02 мая 2020

Если ваш plugin.jar является проектом Spring с @Component, вы можете просто отсканировать пакет:

@ComponentScan(basePackages = {"com.exp"}, basePackageClasses = DependencyBasePackageClass.class)

//external.jar
package com.exp;

import org.springframework.stereotype.Component;

@Component
public class ExpBean {
}

Если бин - это просто класс в external.jar, вы можете создать Factory или Синглтон это и использовать его как Боб.

0 голосов
/ 02 мая 2020

Используйте аннотацию @ComponentScan в классе конфигурации и укажите пакет внешнего компонента:

@Configuration
@ComponentScan(basePackages={"com.foo.bar"})
public class Config { }

Вы также можете определить мета-аннотацию во внешнем банке:

@Retention(value=RUNTIME)
@Target(value=TYPE)
@ComponentScan(basePackages={"com.foo.bar"})
public @interface EnableExternalFoo { }

И применить это к классу конфигурации:

@Configuration
@EnableExternalFoo
public class Config { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...