多种方式实现依赖注入
构造注入
编写测试类
public class UserServiceImpl implements UserService { // 声明接口类型的引用,和具体实现类解耦合 private UserDao dao; // 无参构造 public UserServiceImpl() { } // 用于为dao属性赋值的构造方法 public UserServiceImpl(UserDao dao) { this.dao = dao; } public void addNewUser(User user) { // 调用用户DAO的方法保存用户信息 dao.save(user); } }在使用设值注入时,Spring通过JavaBean无参构造方法实例化对象,当我们编写带参构造方法后,java虚拟机不会再提供默认的无参构造方法,为了保证使用的灵活性,建议自行添加一个无参构造方法
配置文件代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <!-- 定义UserDaoImpl对象,并指定id为userDao --> <bean id="userDao" class="dao.impl.UserDaoImpl" /> <!-- 定义UserServiceImpl对象,并指定id为userService --> <bean id="userService" class="service.impl.UserServiceImpl"> <!-- 通过定义的单参构造为userService的dao属性赋 值 --> <constructor-arg> <!-- 引用id为userDao的对象为userService的dao属性赋值 --> <ref bean="userDao" /> </constructor-arg> </bean> </beans>1 一个 constructor-arg元素表示构造方法的一个参数,且使用时不区分顺序。
2 通过constructor-arg元素的index 属性可以指定该参数的位置索引,位置从0 开始。
3 constructor-arg元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。
constructor-arg节点下的四个属性
- index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;
- type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;
- ref 是指引用的依赖对象;
- value 当注入的不是依赖对象,而是基本数据类型时,就用value;
比如:
<bean id="Rod" class="cn.springdemo.Greeting"> <constructor-arg index="1"> <value>Rod</value> </constructor-arg> <constructor-arg index="0"> <value>世界上有10种人</value> </constructor-arg> </bean>使用p命名空间实现属性注入
p命名空间的特点:使用属性而不是子元素的形式配置Bean的属性,从而简化了配置代码
