• (修改完成)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”>

  • 相关阅读:
    20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第一周)
    20165101刘天野 2017-2018-2 《Java程序设计》第6周学习总结
    20165101 实验一 Java开发环境的熟悉
    20165101刘天野 2017-2018-2 《Java程序设计》第5周学习总结
    HTML——meta
    CSS——改变浏览器滚动条样式
    HTML5——移动端的点击、拖拽
    JS高级——弹出框的美化
    JS高级——监听浏览器的返回事件
    JS高级——文件操作
  • 原文地址:https://www.cnblogs.com/Master-Sun/p/14316741.html
Copyright © 2020-2023  润新知