Статический метод имеет две основные цели:
Spring работает в автономном приложении. Вы используете неправильный способ создания весеннего боба. Правильный способ сделать это следующим образом:
@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. Поэтому Spring не дает возможности Autowire
зависимостям (что вызывает NullPointerException
).
Во втором случае (в этом ответе) вы получаете компонент из контекста Spring и, следовательно, управляете Spring, а 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.
Мой учебник Standalone Spring показывает, как создать автономное приложение Spring с XML и аннотациями.
Для Spring 4, используя Spring Boot, мы можем иметь следующий пример, не используя анти-шаблон для непосредственного получения Bean из 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
или его подпакетами.
new ArrayList()
, например? Если у вас есть класс с автоуведомленными параметрами, и вы создаете его с помощьюnew
, то автоустановка не состоится. – Paul 30 July 2011 в 20:24<context:annotation-config /> <context:component-scan base-package="com.yourcompany.mycomponents" />
– Mikael Vandmo 9 April 2013 в 14:30