Инъекция пружинных бобов в основной класс метода - PullRequest
12 голосов
/ 29 ноября 2011

У меня есть веб-приложение с весны 3.0.Мне нужно запустить класс с методом main из cron, который использует bean-компоненты, определенные в appcontext xml (используя аннотации сканирования компонентов).У меня есть мой основной класс в том же каталоге src.Как я могу внедрить бины из веб-контекста в основной метод.Я попытался сделать это, используя

ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml");

Я попытался использовать AutoWired, и он возвращает нулевой компонент.Поэтому я использовал приложение ctx, и это создает новый контекст (как и ожидалось), когда я запускаю метод main.Но возможно ли, что я могу использовать существующие бины из контейнера.

 @Autowired
 static DAO dao;

    public static void main(String[] args) {
                 ApplicationContext context = new ClassPathXmlApplicationContext("xman-         servlet.xml");
    TableClient client = context.getBean(TableClient.class);
    client.start(context);

}

Ответы [ 5 ]

6 голосов
/ 29 ноября 2011

Вы не можете внедрить bean-компонент Spring ни в один объект, который не был создан Spring.Другой способ сказать это: Spring может внедрять только объекты, которыми он управляет.

Поскольку вы создаете контекст, вам нужно вызвать getBean для вашего объекта DAO.

Извлечь Spring Batch это может быть полезно для вас.

2 голосов
/ 19 января 2014

Попробуйте с этим Main:

public class Main {

    public static void main(String[] args) {
        Main p = new Main();
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        ApplicationContext context = 
             new ClassPathXmlApplicationContext("classpath*:/META-INF/spring/applicationContext*.xml");
        System.out.println("The method of my Bean: " + myBean.getStr());
    }
}

И этот Боб:

@Service 
public class MyBean {
    public String getStr() {
        return "mybean!";
    }
}
1 голос
/ 29 февраля 2016

Spring boot предоставляет официальное решение для этого. Скачать скелет из

https://start.spring.io/

и убедитесь, что упаковка в файле pom.xml установлена ​​в jar. Пока вы не включите веб-зависимость, приложение останется консольным приложением.

1 голос
/ 21 января 2012

Для решения этой проблемы я создал https://jira.springsource.org/browse/SPR-9044. Если вам нравится предложенный подход, проголосуйте за него.

1 голос
/ 29 ноября 2011

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

Но вы получите разные экземпляры, так как у вас будут запущены две JVM.Если вы действительно хотите повторно использовать одни и те же экземпляры bean-компонентов, то ваш основной класс должен удаленно вызывать какой-либо метод bean-компонента в вашем веб-приложении, используя веб-службу или HttpInvoker.

...