解决Spring中Bean之间的依赖的实现方式,在Spring的概念中就被称之为依赖注入(Dependency Injection,DI)。普遍认为的Spring依赖注入的实现方式有三种:构造方法注入、setter方法注入、注解注入。但,就我而言,我认为应该划分为两种形式——基于XML注入和基于注解注入,然后再细分为下面的形式:
DI实现.png
基于XML的注入方式是我们最先学习和使用的方式,也是最熟悉的方式,就简单的做个介绍,举个例子。
通过构造方法注入
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
/**继承自UserService的方法**/
首先定义一个服务层UserServiceImpl,然后在其内部增加对dao层的引用userDao。
接下来就是添加一个构造方法public UserServiceImpl(UserDao userDao)以待Spring通过这个方法为userDao注入实例。
通过构造方法的注入,必须要注入类中具有对应的构造方法,若没有对应的构造方法,会出现报错。
通过setter方法注入
修改UserServiceImpl.java为:
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**继承自UserService的方法**/
}
再修改XML文件内容为:
这两种方式的区别在于,一、UserServiceImpl.java可以不用添加构造方法,但是必须存在一个无参构造方法(如public UserServiceImpl(),示例里面没写,是因为java默认会提供一个无参构造方法)以供Spring 容器注册生成Bean(如userService)。二、XML文件中,采用构造方法注入时,需要使用
在XML注入过程中,除了使用ref=""引用之外,还可以使用value=""设定具体的值,其效果和使用注解@Value差不多。
基于注解的依赖注入
@Autowired