Spring加载类对象的时机?
- spring启动时资源的加载顺序:类的属性->静态方法–>无参构造–>注入@Autowired修饰的依赖–>执行@postConstruct修饰的init()方法。
Spring中在静态方法中调用@Autowired注入的实例对象
- 了解完spring加载资源的顺序后,可知如下编码是不能顺利使用的,虽然能编译过,但在执行的时候会报空指针异常
@Component
public class Application {
@Autowired
private static BookDao bookDao;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
for (int i = 10; i < 20; i++) {
Book book = new Book();
book.setName("java编程思想" + i);
book.setNumber(i);
book.setDetail("java书籍" + i);
bookDao.addBook(book);
}
}
}
那么问题来了如何实现在静态方法中使用@Autowired注入的实例对象呢?
方式一:
@Component
public class Application {
private static BookDao bookDao;
@Autowired
public void setBookDao(BookDao bookDao) {
Application.bookDao = bookDao;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
for (int i = 10; i < 20; i++) {
Book book = new Book();
book.setName("java编程思想" + i);
book.setNumber(i);
book.setDetail("java书籍" + i);
bookDao.addBook(book);
}
}
}
方式二:
@Component
public class Application {
private static BookDao bookDao;
@Autowired
public Application(BookDao bookDao) {
Application.bookDao = bookDao;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
for (int i = 10; i < 100; i++) {
Book book = new Book();
book.setName("java编程思想" + i);
book.setNumber(i);
book.setDetail("java书籍" + i);
bookDao.addBook(book);
}
}
}
方式3:
@Component
public class Application {
private static BookDao bookDao;
@Autowired
private BookDao bookDao1;
@PostConstruct
private void beforeInit() {
this.bookDao = bookDao1;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
for (int i = 10; i < 100; i++) {
Book book = new Book();
book.setName("java编程思想" + i);
book.setNumber(i);
book.setDetail("java书籍" + i);
bookDao.addBook(book);
}
}
}