(修改完成)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;
}
User.java
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;

}
Dog.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 Address {
    private String addressInfo;
}
Address.java

 

 

(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>
beans.xml

 

 

 

(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;
}
Cat.java

 

(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”>

 

posted @ 2021-01-23 10:18  Master_Sun  阅读(170)  评论(0编辑  收藏  举报