您正在创建新实例
Controller controller = new Controller();
手动操作,此实例不在Spring上下文中。因此,注入的(自动连接的)Service实例为空。
@Autowired
仅当实例存在于Spring上下文中时才有效。
最好的方法是通过构造函数注入来保持控制器的可测试性:
@Configuration
@SpringBootApplication
@ImportResource({"classpath:applicationContext.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Controller controller = new Controller(new ServiceImpl(new DaoImpl()));
controller.triggerJob();
}
}
通过构造函数注入实例:
@Controller
public class Controller {
private final Service Service;
public Controller(final Service Service) {
this.service = service;
}
public void triggerJob() {
Service.selectRecords();
}
}
并通过构造函数注入Dao依赖:
@Service
public class ServiceImpl implements Service {
private final Dao dao;
public ServiceImpl(final Dao dao) {
this.dao = dao;
}
@Override
public List<VO> selectRecords() {
return dao.selectRecords();
}
}
对于4.3以上的Spring版本,
@自动接线
Spring会自动扫描注入并通过构造函数注入依赖关系。
对于低于4.3的Spring版本,添加
@自动接线
除施工人员外,即:
@Controller
public class Controller {
private final Service Service;
@Autowired
public Controller(final Service Service) {
this.service = service;
}
public void triggerJob() {
Service.selectRecords();
}
}