(修改完成)spring 梳理3--依赖注入DI 、 set方法注入、构造方法注入(手动装配)
(1)对象是有属性的,属性是需要赋值的。通常的方式是:
(set)这需要我们手动使用set方法去赋值操作,
Student student = new Student(); student.setName("张三"); student.setAge(23); Teacher teacher = new Teacher(); student.setTeacher(teacher);
(2)当然我们还可以:
(构造方法)使用User的构造方法去赋值
Student student = new Student("李四",12,teacher);
但是归根结底,都需要我们自己去赋值。
(一)依赖注入DI
控制反转(IOC) 也叫 依赖注入(DI)的核心思想是,构建对象(包括初始化和赋值)都不需要人为操作,而是将这个权利交付给容器来进行。
依赖注入DI也有两种方式:构造方法注入 和 set方法注入
(二)set方法注入
要求被注入的属性 , 必须有set方法 。 set方法的方法名由set + 属性首字母大写 如果属性是boolean类型 , 没有set方法 , 是 is + 属性首字母大写 .
目录:
(1)
User里,几种不同的参数类型,体会如何set方法注入
package com.xinzhi.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; /** * @author sr * @date 2021/1/24 */ @Data @AllArgsConstructor @NoArgsConstructor public class User { //姓名 private String name; //地址 private Address address; //爱好 private String[] hobbies; //职务 private List<String> duties; //家庭关系 private Map<String,String> familyTies; //购物车商品 private Set<String> carts; //工作经历 private Properties workExperience; //狗狗 private Dog dog; }
package com.xinzhi.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author sr * @date 2021/1/24 */ @Data @AllArgsConstructor @NoArgsConstructor public class Dog { private String type; }
package com.xinzhi.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author sr * @date 2021/1/24 */ @Data @NoArgsConstructor @AllArgsConstructor public class Address { private String addressInfo; }
(2)beans.xml
①beans.xml 里面,一个<bean>就是一个对象
②体会不同类型如何注入
③每一个引用对象,都需要注入
<bean> <bean>
<property name=" " value=“ ” /> <property name=" " >
或者 <!--数组、list、set、map、pro各不相同-->
</property>
</bean> </bean>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="user" class="com.xinzhi.entity.User"> <property name="name" value="孙锐"/> <property name="address" ref="address"/> <!-- 数组注入 --> <property name="hobbies"> <array> <value>sing</value> <value>dance</value> <value>rap</value> <value>basketball</value> </array> </property> <!-- list注入 --> <property name="duties"> <list> <value>班长</value> <value>学习委员</value> </list> </property> <!-- map注入 --> <property name="familyTies"> <map> <entry key="father" value="父亲"/> <entry key="mother" value="母亲"/> </map> </property> <!-- set注入 --> <property name="carts"> <set> <value>笔</value> <value>衣服</value> <value>鞋子</value> </set> </property> <!-- property注入 --> <property name="workExperience"> <props> <prop key="第一年">实习了</prop> <prop key="第二年">正式工作了</prop> </props> </property> <property name="dog" ref="jinmao"/> </bean> <bean id="address" class="com.xinzhi.entity.Address"> <property name="addressInfo" value="南京"/> </bean> <bean id="teddy" class="com.xinzhi.entity.Dog"> <property name="type" value="泰迪"/> </bean> <bean id="jinmao" class="com.xinzhi.entity.Dog"> <property name="type" value="金毛"/> </bean> </beans>
(3)测试
测试里面的 对象的名字,不一定要和<bean id 一致!只要applicationContext.getBean里面的第一个参数跟其一致即可!
TestFirst.java
@Test public void testDI(){ //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); User user = applicationContext.getBean("user", User.class); System.out.println(user); }
(4) 结果
User(name=孙锐, address=Address(addressInfo=南京), hobbies=[sing, dance, rap, basketball], duties=[班长, 学习委员], familyTies={father=父亲, mother=母亲}, carts=[笔, 衣服, 鞋子], workExperience={第一年=实习了, 第二年=正式工作了}, dog=Dog(type=金毛))
(三) 构造方法注入
(1)Cat.java
package com.xinzhi.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author sr * @date 2021/1/24 */ @Data @NoArgsConstructor @AllArgsConstructor public class Cat { private String type; private int age; }
(2)beans.xml
里添加
<bean id="tom" class="com.xinzhi.entity.Cat"> <constructor-arg name="type" value="蓝猫"/> <constructor-arg name="age" value="2"/> </bean>
(3)TestFirst.java
测试里面的 对象的名字,不一定要和<bean id 一致!只要applicationContext.getBean里面的第一个参数跟其一致即可!
@Test public void testDI2(){ //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Cat tom1 = applicationContext.getBean("tom", Cat.class); System.out.println(tom1); }
(4)结果
Cat(type=蓝猫, age=2)
注:无参构造
<bean id="goldilocks" class="com.xinzhi.entity.Dog" />
注意:value属性注入的是基本类型,如果是引用类型要使用ref 连接其他的bean,也就是说,这个要注入的引用类型,也需要<bean> 。
<property name=“类里面的变量名” value或者ref=“xml里面 bean 的id”>