Инъекция Spring bean в основной класс метода

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

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

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

 @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);

}

person riamob    schedule 29.11.2011    source источник
comment
Для будущих читателей, тесно связанный вопрос: stackoverflow .com / questions / 3659720 /.   -  person Jonik    schedule 11.04.2013


Ответы (5)


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

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

Посмотрите Spring Batch, он может быть вам полезен.

person DwB    schedule 29.11.2011

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

https://start.spring.io/

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

person Peter Szanto    schedule 29.02.2016

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

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

person JB Nizet    schedule 29.11.2011

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

person btiernay    schedule 21.01.2012

Попробуйте с этим 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!";
    }
}
person madx    schedule 19.01.2014