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. До тех пор, пока вы не включите какую-либо сетевую зависимость, приложение останется консольным приложением.