所谓依赖注入,其实就是给对象里的属性赋值,因为对象里有其他对象,因此就形成了依赖。Spring有4种方式来给属性赋值:
构造方法注入是指在构造方法中注入属性或者对象来实现依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过this.username获取到值admin。其中引用类型使用ref属性,基本类型使用value属性。
public class UserDaoImpl {
private String username;
public UserDaoImpl(String username) {
this.username = username;
}
}
<bean id="userDaoImpl" class="com.example.UserDaoImpl">
<constructor-arg name="username" value="admin">constructor-arg>
bean>
set方法注入就是通过在类中实现get、set方法来实现属性或者对象的依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过getUsername()获取到值admin。
public class UserDaoImpl {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
<bean id="userDaoImpl" class="com.example.UserDaoImpl">
<property name="username" value="admin">property>
bean>
Spring提供了自动装配的功能,简化了我们的配置,自动装配默认是不打开的,常用的方式有两种:
<bean id="userDao" class="com.example.UserDao">bean>
<bean id="userService" class="com.example.UserService" autowire="byName"/>
<bean id="userDao" class="com.example.UserDao">bean>
<bean id="userService" class="com.example.UserService" autowire="byType"/>
public class UserController {
@Autowired
private IUserService userService;
}
@Resource注解可以实现自动装配,它有两个重要属性name和type,name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired注解和@Resource注解的作用相同,只不过@Autowired按照byType注入,如果@Autowired想使用名称可以结合@Qualifier注解进行使用