Использование Spring 3 autowire в автономном приложении Java
вот мой код:
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("META-INF/config.xml");
System.out.println("my beans method: " + myBean.getStr());
}
}
@Service
public class MyBean {
public String getStr() {
return "string";
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="mypackage"/>
</beans>
почему это не работает? Я получаю NullPointerException
. Можно ли использовать autowiring в автономном приложении?
3 ответа:
Весна работает в автономном приложении. Вы используете неправильный способ создания spring bean. Правильный способ сделать это так:
@Component public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/config.xml"); Main p = context.getBean(Main.class); p.start(args); } @Autowired private MyBean myBean; private void start(String[] args) { System.out.println("my beans method: " + myBean.getStr()); } } @Service public class MyBean { public String getStr() { return "string"; } }
в первом случае (в вопросе), вы создаете объект самостоятельно, а не получать его из контекста Spring. Так что весна не получает шанса
Autowire
зависимости (что вызываетNullPointerException
).во втором случае (тот, что в этом ответе), вы получаете Боб из контекста Spring и следовательно, это весна управляется и весна заботится о
autowiring
.
Spring уходит от XML-файлов и сильно использует аннотации. Следующий пример представляет собой простое автономное приложение Spring, которое использует аннотации вместо XML-файлов.
package com.zetcode.bean; import org.springframework.stereotype.Component; @Component public class Message { private String message = "Hello there!"; public void setMessage(String message){ this.message = message; } public String getMessage(){ return message; } }
это простой Боб. Он оформлен с помощью тега
@Component
примечание для автоматического обнаружения контейнером весны.package com.zetcode.main; import com.zetcode.bean.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = "com.zetcode") public class Application { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); Application p = context.getBean(Application.class); p.start(); } @Autowired private Message message; private void start() { System.out.println("Message: " + message.getMessage()); } }
главная
Application
класса. Элемент@ComponentScan
аннотация ищет компоненты. Элемент@Autowired
аннотация вводит боб вmessage
переменной. ЭлементAnnotationConfigApplicationContext
используется для создания контекста приложения Spring.мой автономный весенний учебник показывает, как создать автономное приложение Spring с XML и аннотациями.
для Spring 4, используя Spring Boot, мы можем иметь следующий пример без использования анти-шаблона получения Боба из ApplicationContext напрямую:
package com.yourproject; @SpringBootApplication public class TestBed implements CommandLineRunner { private MyService myService; @Autowired public TestBed(MyService myService){ this.myService = myService; } public static void main(String... args) { SpringApplication.run(TestBed.class, args); } @Override public void run(String... strings) throws Exception { System.out.println("myService: " + MyService ); } } @Service public class MyService{ public String getSomething() { return "something"; } }
убедитесь, что все ваши вводимые услуги находятся под
com.yourproject
или его подпакетов.