spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入
三种注入方式
第一种: 基于构造函数
hi.java (bean)
package test_one; public class hi { private String name; public hi(String name) { this.name=name; } public void sayhi() { System.out.println("你好呀 "+this.name); } }
<bean id="binbin" class="test_one.hi" scope="singleton"> <constructor-arg name="name" value="斌斌"/> bean>
上面是通过配置文件注入字符串
我们来看看如何注入bean
<bean id="binbin" class="test_one.hi" scope="singleton"> <constructor-arg ref="No"/> bean> <bean id="No" class="test_one.no">bean>
<bean id="binbin" class="test_one.hi" scope="singleton" p:name="斌斌" p:age="17" p:a-ref="No">bean> <bean id="No" class="test_one.no" p:name="明明">bean>
第四种:使用c命名空间注入
与p命名空间注入一样,不过是基于构造函数注入
xmlns:c="http://www.springframework.org/schema/c"
<bean id="C" class="test_one.c_name" c:name="i'm c"/>
如果注入的是数组,List , Set , map, Properties
hi.java (bean)
package test_one; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class hi { private String[] myStrs; private ListmyList; private Set mySet; private Map myMap; private Properties myProps; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List myList) { this.myList = myList; } public void setMySet(Set mySet) { this.mySet = mySet; } public void setMyMap(Map myMap) { this.myMap = myMap; } public void setMyProps(Properties myProps) { this.myProps = myProps; } public String[] getMyStrs() { return myStrs; } public List getMyList() { return myList; } public Set getMySet() { return mySet; } public Map getMyMap() { return myMap; } public Properties getMyProps() { return myProps; } public void print() { System.out.println("array:"+myStrs[0]+" "+myStrs[1]+"\nList:"+myList+"\nSet:"+mySet+"\nMap:"+myMap+"\nProperties:"+myProps); } }
<bean id="binbin" class="test_one.hi" scope="singleton"> <property name="myStrs"> <array> <value>array_onevalue> <value>array_twovalue> array> property> <property name="myList"> <array> <value>List_onevalue> <value>List_twovalue> array> property> <property name="mySet"> <list> <value>1314value> <value>520value> list> property> <property name="myMap"> <props> <prop key="testA">map_oneprop> <prop key="testB">map_twoprop> props> property> <property name="myProps"> <map> <entry key="testA" value="properties_one"/> <entry key="testB"> <value>properties_twovalue> entry> map> property> bean>
可以发现我将array, list,set 的元素混用了,将map和props混用了
也就是说 array,list ,set之间可以混用,map与props之间可以混用。 不过在实际开发时还是元素和数据类型对应使用
如果集合的数据类型是其他类型,在配置文件中,会自动将value的值转化为对应类型
注入Properties数据的另一种方式,更加简便
key=value 的写法
<property name="myProps"> <value> testA=Properties_one testB=Properties_two value> property>
引用bean注入
参考:https://www.cnblogs.com/CloudComputing-binbin/p/15939822.html
内部bean注入
内部bean也称为内部匿名bean, 如果需要注入bean并且只用于一个特定的属性,建议使用内部bean
内部bean无法被外部bean引用,哪怕你加上id,她会无视scope标签
<bean id="binbin" class="test_one.hi" scope="singleton"> <property name="myStrs"> <array> <bean class="test_one.no" parent="parent"/> array> property> bean>
那个内部bean是通过抽象bean注入的,想了解抽象bean请参考:
Null以及空字符的值
<bean class="ExampleBean"> <property name="email" value=""/> bean>
什么示例与下列java代码效果一样
ExampleBean.setEmail("");
<bean class="ExampleBean"> <property name="email"> <null/> property> bean>
与下面的java代码效果一样
ExampleBean.setEmail(null);