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

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

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

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

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

}

Ответ 1

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

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

Отъезд Spring Пакет может быть вам полезен.

Ответ 2

Попробуйте с помощью этого 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());
    }
}

И этот Bean:

@Service 
public class MyBean {
    public String getStr() {
        return "mybean!";
    }
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

Spring boot является официальным решением для этого. Загрузите скелет из

https://start.spring.io/

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