Spring——多种方式实现依赖注入
在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性。Spring会从这里获取必要的信息来创建bean。
但是,在XML中声明DI时,会有多种可选的配置方式和风格,具体到setter方式、构造器方式和P命名空间方式。
一、使用setter进行注入
二、使用构造注入
- 为POJO类创建带参的构造方法
- 使用<constructor-arg>元素
给原先的实体类添加构造,记得带着无参构造,这个问题在这里不细说
Spring配置文件如下
<bean id="student" class="com.cmy.entity.StudentBean"> <!--constructor-arg:代表构造函数中的一个参数 索引从0开始--> <constructor-arg type="java.lang.String" value="呵呵"></constructor-arg> <constructor-arg type="int" value="16"></constructor-arg> </bean>
注意:
1、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。
2、通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置 从0 开始。
3、<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。
三、使用P命名空间进行注入
<bean id="student" class="com.cmy.entity.studentBean" p:name="呵呵" p:age="16"> </bean>
注意:
1、P命名空间注入的方式也是使用setter方式注入,所有POJO类中必须存在对应的set方法
2、 使用前需要在Spring的配置文件中引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"
AOP也同样如此,不过在idea中可以使用ctrl+Enter自动引入 xmlns:aop="http://www.springframework.org/schema/aop"
四、注入不同的类型
这个关注第四点,POJO类如下:
public class Datetype { //数组 private String[] arrays; //list private List<Integer> lists; //set private Set<Integer> sets; //map private Map<String,String> maps; //配置 private Properties pros; public String[] getArrays() { return arrays; } public void setArrays(String[] arrays) { this.arrays = arrays; } public List<Integer> getLists() { return lists; } public void setLists(List<Integer> lists) { this.lists = lists; } public Set<Integer> getSets() { return sets; } public void setSets(Set<Integer> sets) { this.sets = sets; } public Map<String, String> getMaps() { return maps; } public void setMaps(Map<String, String> maps) { this.maps = maps; } public Properties getPros() { return pros; } public void setPros(Properties pros) { this.pros = pros; } @Override public String toString() { return "Datetype{" + "arrays=" + Arrays.toString(arrays) + ", lists=" + lists + ", sets=" + sets + ", maps=" + maps + ", pros=" + pros + '}'; } }
大配置文件:
<bean id="dateType" class="cn.spring.entity.Datetype"> <property name="arrays"> <array> <value>hehe</value> <value>haha</value> </array> </property> <property name="lists"> <list> <value>1</value> <value>2</value> </list> </property> <property name="sets"> <set> <value>3</value> <value>4</value> </set> </property> <property name="maps"> <map> <entry key="c" value="才"></entry> <entry value="的" key="d"></entry> </map> </property> <property name="pros"> <props> <prop key="a">啊</prop> <prop key="b">吧</prop> </props> </property> </bean>
测试类:
输出结果:
五、域属性的自动注入
在之前我们采用手动的域属性注入,即:
这里采用自动注入,自动注入有两种方式:
1.byName:保证域属性名字和bean的id一致
2.byType:保证域属性的类型和bean的类型一致,与其相兼容的类型也不可以