Spring注入
什么是注入?
1、通过Spring工厂及配置文件,为所创建对象的成员变量赋值。
为什么需要注入?
通过编码的方式,为成员变量进行赋值,存在耦合。
如何进行注入?
-
类为成员变量提供set,get方法
-
配置spring的配置文件
<bean id="person" class="com.example.ex1.Person"> <property name="id"> <value>10</value> </property> <property name="name"> <value>aaa</value> </property> </bean>
有什么好处?
解耦合。
set注入
注入成员变量分类

1、String
<value></value>
2、数组
<list>
<value></value>
</list>
3、集合(里面的标签,具体情况具体分析,可以为任意标签)
<set>
<value></value>
<value></value>
</set>
4、List集合(里面的标签,具体情况具体分析,可以为任意标签)
<list></list>
5、map集合(键值的标签,具体情况具体分析,可以为任意标签)
<map>
<entry>
<key><value></value></key>
<value></value>
</entry>
</map>
6、properties类型
private Properties p;
<property name="p">
<props>
<prop key="key1">value1</prop>
</props>
</property>
用户自定义类型
<property name="userDao">
<bean class="com.example.ex1.UserDaoImpl" />
</property>
这种配置方式会导致配置文件代码冗余,被注入 的对象多次创建,浪费虚拟机内存资源。
第二种配置方式:
把冗余代码写在外面,然后引用。

value和ref可以简化写到property内部。
例如 <property name="hh" value="dfs" />
简化写法2用命名空间 p
<bean id="person" class="com.example.ex1.Person" p:name="aaa" p:id="100">
</bean>
<bean id="userService" class="com.example.ex1.UserServiceImpl" p:userDao-ref="userDao">
</bean>
构造注入
Spring调用构造方法,通过配置文件,为成员变量赋值。
1、为类提供有参构造方法
2、在配置文件中使用 constructor-arg标签

构造方法重载
参数个数不同时?
通过控制 constructor-arg标签数量来控制。但是只会按顺序赋值。
可以在标签中添加 type通过类型区别来自动选择构造函数。
<constructor-arg type="int"></constructor-arg>