多种方式实现依赖注入 构造注入
编写测试类
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虚拟机不会再提供默认的无参构造方法,为了保证使用的灵活性,建议自行添加一个无参构造方法
配置文件代码如下:
1、一个
constructor-arg节点下的四个属性
index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;
type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;
ref 是指引用的依赖对象;
value 当注入的不是依赖对象,而是基本数据类型时,就用value;
比如:
<bean> <constructor-arg index="1"> <value>Rod</value> </constructor-arg> <constructor-arg index="0"> <value>世界上有10种人</value> </constructor-arg> </bean> 使用p命名空间实现属性注入p命名空间的特点:使用属性而不是子元素的形式配置Bean的属性,从而简化了配置代码
语法:
对于直接量(基本数据类型、字符串)属性:p:属性名="属性值"
对于引用Bean的属性:p:属性名-ref="Bean的id"
使用前先要在Spring配置文件中引入p命名空间
示例:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans "> <!-- 使用p命名空间注入属性值 --> <bean p:username="皮皮" p:age="21" p:email="pipi@anxin.com" /> <bean /> <bean p:dao-ref="userDao" /> </beans> 注入不同数据类型 注入直接量使用
<bean> <property> <value>张三</value> </property> <property> <value>23</value> </property> </bean>如果属性值中包含了XML文件的特殊字符(& < > " '),则注入需要进行处理,通常可以采用两种办法,使用<[CDATA[]]>标记或把特殊字符替换为实体引用.
<bean> <!-- 使用<![CDATA[]]>标记处理XML特 殊字符 --> <property> <value><![CDATA[P&G]]></value> </property> <!-- 把XML特殊字符替换为实体引用 --> <property> <value>P&G</value> </property> <bean> 符号 实体引用< & lt;
> & gt;
& & amp;
' & apos;
" & quot;
注意:在XML文件中字符"<"和“&”是非法的,其他3个符号是合法的,但是将它们替换为实体引用是个好习惯
引用其他Bean组件Spring中定义的Bean可以互相引用,从而建立依赖关系,除了使用ref属性,还可以通过
<bean/> <bean> <property> <ref bean="userDao"/> </property> </bean>使用内部Bean
<!-- 定义内部Bean --> <bean> <property> <bean/> </property> </bean>这样这个UserDaoImpl类型的Bean就只能被userUservice使用,其他的Bean则无法使用
注入集合类型的属性对于List或数组类型的属性,可以使用
<!-- 注入List类型 --> <property> <list> <!-- 定义List中的元素 --> <value>足球</value> <value>篮球</value> </list> </property> <!-- 注入Map类型 --> <property> <map> <!-- 定义Map中的键值对 --> <entry> <key> <value>football</value> </key> <value>足球</value> </entry> <entry> <key> <value>basketball</value> </key> <value>篮球</value> </entry> </map> </property>