目录
依赖注入方式
思考
1.向一个类中传递数据的方式有几种?
①普通方法(set方法)
②构造方法
2.依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或字符串呢?
①引用类型
②简单类型(基本数据类型和String,这不是说数据类型,String为引用数据类型)
依赖注入方式类型
1.setter注入
①简单类型
②引用类型
2.构造器注入
①简单类型
②引用类型
setter注入
引用类型
①在bean中定义引用类型属性并提供可访问的set方法
public class ServiceImpl1 implements Service1 { //删除业务层中使用new方式创建的dao对象 private Dao1 dao1; @Override public void show() { System.out.println("Service..."); dao1.show(); dao2.show(); } //提供对应的set方法 public void setDao1(Dao1 dao1) { System.out.println("set..."); this.dao1 = dao1; } }
②配置中使用property标签ref属性注入引用类型对象
<bean id="Dao1" class="Dao.impl.DaoImpl1"/> <bean id="Service1" class="Service.impl.ServiceImpl1"> <property name="dao1" ref="Dao1"/> </bean>
简单类型
①在bean中定义引用类型属性并提供可访问的set方法
public class DaoImpl1 implements Dao1 { private int Num; private String Name; public void setNum(int num) { this.Num= num; } public void setName(String name) { this.Name= name; } }
②配置中使用property标签value属性注入简单类型数据
<bean id="Dao1" class="Dao.impl.DaoImpl1"> <property name="Num" value="2"/> <property name="Name" value="ylm"/> </bean>
构造器注入
引用类型
①在bean中定义引用类型属性并提供可访问的构造方法
public class ServiceImpl1 implements Service1 { private Dao1 dao1; private Dao2 dao2; public ServiceImpl1(Dao1 dao1, Dao2 dao2) { this.dao1 = dao1; this.dao2 = dao2; } }
②配置中使用constructor-arg标签ref属性注入引用类型对象
<bean id="Service1" class="Service.impl.ServiceImpl1"> <property name="dao1" ref="Dao1"/>--> <property name="dao2" ref="Dao2"/>--> <!--name 指的是构造方法中形参的名字--> <constructor-arg name="dao1" ref="Dao1"/> <constructor-arg name="dao2" ref="Dao2"/> </bean>
简单类型
①在bean中定义引用类型属性并提供可访问的set方法
public class DaoImpl2 implements Dao2 { private int Num; private String Name; public DaoImpl2(int num, String name) { this.Num = num; this.Name = name; } }
②配置中使用constructor-arg标签value属性注入简单类型数据
<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory"> <!--name有顺序对应构造中参数,我反过就报错了--> <constructor-arg name="num" value="19"/> <constructor-arg name="name" value="ylm"/> </bean>
参数适配
配置中使用constructor-arg标签type属性设置按形参类型注入
<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory"> <!--这样就没有顺序,同时也不需要关注构造器的形参的名字,降低耦合--> <constructor-arg type="java.lang.String" value="ylm"/> <constructor-arg type="int" value="19"/> </bean>
配置中使用constructor-arg标签index属性设置按形参位置注入
<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory"> <!--index对应构造方法中的形参的位置--> <constructor-arg index="0" value="19"/> <constructor-arg index="1" value="ylm"/> </bean>
依赖注入方式选择
1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
2.可选依赖使用setter注入进行,灵活性强
3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入总结:建议使用setter注入,第三方技术根据情况选择
集合注入
①数组对象
②List对象
③Set对象
④Map对象
⑤Properties对象
示例
配置
<bean id="Dao3" class="Dao.impl.DaoImpl3"> <property name="array"> <array> <value>100</value> <value>200</value> <value>300</value> <ref bean="beanId"/> </array> </property> <property name="list"> <list> <value>ylm</value> <value>200</value> <value>zxn</value> </list> </property> <property name="set"> <set> <value>100</value> <value>200</value> <value>300</value> <value>300</value> <value>zxn</value> <value>zxn</value> </set> </property> <property name="map"> <map> <entry key="1" value="string"/> <entry key="2" value="100"/> <entry key="3" value="200.00"/> <entry key="4" value="1231"/> </map> </property> <property name="properties"> <props> <prop key="1">100</prop> <prop key="2">zxn</prop> <prop key="3">ylm</prop> </props> </property> </bean>
Dao
public class DaoImpl3 implements Dao3 { private int[] array; private List<String> list; private Set<String> set; private Map<String,String> map; private Properties properties; public void setArray(int[] array) {this.array = array;} public void setList(List<String> list) {this.list = list;} public void setSet(Set<String> set) {this.set = set;} public void setMap(Map<String, String> map) {this.map = map;} public void setProperties(Properties properties) {this.properties = properties;} @Override public void show() { System.out.println("遍历数组:"+ Arrays.toString(array)); System.out.println("遍历list:"+list); System.out.println("遍历set:"+set); System.out.println("遍历map:"+map); System.out.println("遍历properties:"+properties); } }