Возможно ли создание объекта бина @Service? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть спокойное приложение со всеми компонентами @ Service, @ RestController, @ Repository. и я автоматически подключаю требуемые bean-компоненты.

Теперь я хочу использовать класс @service в другом классе, который не управляется весной, возможно ли это?

Эти 2 класса также находятся в 2 diffrent mavenпроекты, если это вызывает разницу

Я пытался создать новый объект, как и ожидалось, не будет. я также пытался создавать различные конструкторы, и это не мешало бы.

Я гуглил для некоторых anwsers, но не нашел ни одного, так что теперь я обращаюсь к вам, эксперты;)

Класс, который я хочу использовать!

@Service
public class ProductService {
    ProductRepository repository;

    @Autowired
    public ProductService(ProductRepository repository){
        this.repository = repository;
    }
}

Restcontroller

@RestController
@RequestMapping(path = "/product")
public class ProductResource {

    @Autowired
    ProductService service;
}

Репо

public interface ProductRepository extends JpaRepository<Product,Long> {
}

Здесь я хочу создать сервис.

public static void main(String[] args) {
    String chromeDriver = args[0];
    String method = args[1];
    String domainName = args[2];
    ProductService service =  new ProductService();
    System.setProperty("webdriver.chrome.driver", chromeDriver);
    Runner runner = new Runner(method,domainName);
    runner.run();
}

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Я думаю, что это невозможно (я имею в виду, что это технически, но это не сработает).
Чтобы иметь доступ к вашему классу обслуживания, ваше второе приложение должно иметь доступ к тому же Spring Context.

Это потому, что Spring Context в вашем базовом приложении определяет необходимые зависимости, к которым у вашего второго приложения нет доступа. Одним из примеров этого является ProductRepository repository (именно так приложение Spring Boot будет взаимодействовать с базой данных), не имеющее Spring Context и, следовательно, информацию о DB location и connection URL.

В вашем случае вам нужно скопировать класс и механизм для подключения к БД с конфигурацией БД во втором проекте.

0 голосов
/ 02 октября 2019

Существует обходной путь для «внедрения» зависимостей вручную. Создайте управляемый компонент, который хранит ссылку на ApplicationContext в статической переменной, чтобы вы могли получить доступ из неуправляемых классов:

@Component
public class ApplicationContextProvider  implements ApplicationContextAware  {

    private static ApplicationContext applicationContext;

    public static ApplicationContext applicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        ApplicationContextProvider.applicationContext = applicationContext;
    }

}
public class NoManagedClass {

    private final ManagedClass bean;

    public NoManagedClass() {
       this.bean = ApplicationContextProvider.applicationContext().getBean(ManagedClass.class);
    }
}

Однако имейте в виду, что ваши неуправляемые объекты должныбыть создан после того, как установлен контекст приложения. Вам все еще нужно запустить приложение Spring в методе main, чтобы компоненты были инициализированы.

0 голосов
/ 02 октября 2019

Насколько я знаю, вы можете создать экземпляр класса, управляемого Spring, в классе, не управляемом Spring, если класс, управляемый Spring (в данном случае служба), не содержит в нем никаких зависимостей Spring,поскольку они останутся нулевыми (не инициализированными), потому что они никогда не будут внедрены Spring.

Ваш сервис мне подходит, потому что поле ProductRepository не @autowired, но в вашем коде вы создаете ProductServiceнапример:

ProductService service =  new ProductService();

Пока этот конструктор без параметров не существует в классе ProductService:

@Service
public class ProductService 
{
    ProductRepository repository;

    @Autowired
    public ProductService(ProductRepository repository)
    {
        this.repository = repository;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...