• (续)SSM整合之spring笔记(IOC 依赖注入的方式)(P070—P072)


    2.4 实验三:依赖注入之setter注入

    依赖注入(DI):是IOC的一种具体的实现方式

    IOC是从当前资源获取的角度来说,我们原先来主动获取,现在是被动的接受,原来是直接new ,现在我需要 我们只需要把我们依赖的对象设置成相对应的方法,比如set方法  有参构造 然后以我们设置好的方法 来接受spring为我们所注入对象

    比如:

    1. public class Student {
    2. private Integer id;
    3. private String name;
    4. private Integer age;
    5. private String sex;
    6. public Student() {
    7. }
    8. public Integer getId() {
    9. return id;
    10. }
    11. public void setId(Integer id) {
    12. this.id = id;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public Integer getAge() {
    21. return age;
    22. }
    23. public void setAge(Integer age) {
    24. this.age = age;
    25. }
    26. public String getSex() {
    27. return sex;
    28. }
    29. public void setSex(String sex) {
    30. this.sex = sex;
    31. }
    32. @Override
    33. public String toString() {
    34. return "Student{" +
    35. "id=" + id +
    36. ", name='" + name + '\'' +
    37. ", age=" + age +
    38. ", sex='" + sex + '\'' +
    39. '}';
    40. }

    Student里面的id,name age  sex ,我们就说Student依赖于id,name age  sex 属性(对象依赖于属性),那么我们就可以在IOC容器中,为我们所依赖的属性来进行赋值

    所以依赖注入就是为我们类的属性进行赋值的一个过程

    ①创建学生类 Student
    1. package com.atguigu.spring.pojo;
    2. public class Student implements Person {
    3. private Integer sid;
    4. private String sname;
    5. private Integer age;
    6. private String gender;
    7. public Student() {
    8. }
    9. public Student(Integer sid, String sname, Integer age, String gender) {
    10. this.sid = sid;
    11. this.sname = sname;
    12. this.age = age;
    13. this.gender = gender;
    14. }
    15. public Integer getSid() {
    16. return sid;
    17. }
    18. public void setSid(Integer sid) {
    19. this.sid = sid;
    20. }
    21. public String getSname() {
    22. return sname;
    23. }
    24. public void setSname(String sname) {
    25. this.sname = sname;
    26. }
    27. public Integer getAge() {
    28. return age;
    29. }
    30. public void setAge(Integer age) {
    31. this.age = age;
    32. }
    33. public String getGender() {
    34. return gender;
    35. }
    36. public void setGender(String gender) {
    37. this.gender = gender;
    38. }
    39. @Override
    40. public String toString() {
    41. return "Student{" +
    42. "sid=" + sid +
    43. ", sname='" + sname + '\'' +
    44. ", age=" + age +
    45. ", gender='" + gender + '\'' +
    46. '}';
    47. }
    48. }
    ②配置 bean 时为属性赋值
    依赖注入的第一种方法,叫做 setter 注入,其实就是当前为属性,为成员变量,提前设置好的一些方式,通过这些方式 比如set 构造器 等方式为成员变量赋值 的一个过程,
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="studentOne" class="com.atguigu.spring.pojo.Student">bean>
    6. <bean id="studentTwo" class="com.atguigu.spring.pojo.Student">
    7. <property name="sid" value="1001">property>
    8. <property name="sname" value="张三">property>
    9. <property name="age" value="23">property>
    10. <property name="gender" value="男">property>
    11. bean>
    12. beans>
    ③测试
    1. @Test
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. Student student = ioc.getBean("studentTwo", Student.class);
    7. System.out.println(student);
    8. }

    2.5 实验四:依赖注入之构造器注入

    构造器注入:通过构造器的有参构造来为当前的成员变量赋值

    在一个类中为成员变量赋值的于种方式:set方法  和有参构造

    ①在 Student 类中添加有参构造
    1. package com.atguigu.spring.pojo;
    2. public class Student implements Person {
    3. private Integer sid;
    4. private String sname;
    5. private Integer age;
    6. private String gender;
    7. public Student() {
    8. }
    9. public Student(Integer sid, String sname, Integer age, String gender) {
    10. this.sid = sid;
    11. this.sname = sname;
    12. this.age = age;
    13. this.gender = gender;
    14. }
    15. public Integer getSid() {
    16. return sid;
    17. }
    18. public void setSid(Integer sid) {
    19. this.sid = sid;
    20. }
    21. public String getSname() {
    22. return sname;
    23. }
    24. public void setSname(String sname) {
    25. this.sname = sname;
    26. }
    27. public Integer getAge() {
    28. return age;
    29. }
    30. public void setAge(Integer age) {
    31. this.age = age;
    32. }
    33. public String getGender() {
    34. return gender;
    35. }
    36. public void setGender(String gender) {
    37. this.gender = gender;
    38. }
    39. @Override
    40. public String toString() {
    41. return "Student{" +
    42. "sid=" + sid +
    43. ", sname='" + sname + '\'' +
    44. ", age=" + age +
    45. ", gender='" + gender + '\'' +
    46. '}';
    47. }
    48. }

    ②配置 bean
    1. <bean id="studentThree" class="com.atguigu.spring.pojo.Student">
    2. <constructor-arg value="1002">constructor-arg>
    3. <constructor-arg value="李四">constructor-arg>
    4. <constructor-arg value="24">constructor-arg>
    5. <constructor-arg value="女">constructor-arg>
    6. bean>
    ③测试
    1. @Testj
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. // Student student = ioc.getBean("studentTwo", Student.class);
    7. Student student = ioc.getBean("studentThree", Student.class);
    8. System.out.println(student);
    9. }

    注意:
    constructor-arg 标签还有两个属性可以进一步描述构造器参数:
    index 属性:指定参数所在位置的索引(从 0 开始)
    name 属性:指定参数名
    在设置一个属性  设置get/set方法  重写tostrig方法  然后把有参的

    原来

    1. public Student(Integer sid, String sname, Integer age, String gender) {
    2. this.sid = sid;
    3. this.sname = sname;
    4. this.age = age;
    5. this.gender = gender;
    6. }

    现在 

    1. public Student(Integer sid, String sname, String gender, Integer age) {
    2. this.sid = sid;
    3. this.sname = sname;
    4. this.age = age;
    5. this.gender = gender;
    6. }

    在设置一个有参构造

    1. public Student(Integer sid, String sname, String gender, Double score) {
    2. this.sid = sid;
    3. this.sname = sname;
    4. this.gender = gender;
    5. this.score = score;
    6. }

    问题:

    1. <bean id="studentThree" class="com.atguigu.spring.pojo.Student">
    2. <constructor-arg value="1002">constructor-arg>
    3. <constructor-arg value="李四">constructor-arg>
    4. <constructor-arg value="女">constructor-arg>
    5. <constructor-arg value="24">constructor-arg>
    6. bean>

    24 能够匹配到Integer age 也能够匹配到Double score  24是整型  所以到底匹配哪个有参构造

    测试:匹配到Double score 

     如何匹配到Integer age

    解决

    1. <bean id="studentThree" class="com.atguigu.spring.pojo.Student">
    2. <constructor-arg value="1002">constructor-arg>
    3. <constructor-arg value="李四">constructor-arg>
    4. <constructor-arg value="女">constructor-arg>
    5. <constructor-arg value="24" name="age">constructor-arg>
    6. bean>

    提问:

    null 特殊字符   属性是个类类型 或是接口类型    数组  list  map集合应该如何赋值

    2.6 实验五:特殊值处理  

    ①字面量赋值
    什么是字面量?
    int a = 10;
    声明一个变量 a ,初始化为 10 ,此时 a 就不代表字母 a 了,而是作为一个变量的名字。当我们引用 a
    的时候,我们实际上拿到的值是 10
    而如果 a 是带引号的: 'a' ,那么它现在不是一个变量,它就是代表 a 这个字母本身,这就是字面
    量。所以字面量没有引申含义,就是我们看到的这个数据本身。
    1. <property name="name" value="张三"/>
    null

    如果是这样可以吗?

    1. <bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    2. <property name="sid" value="1003">property>
    3. <property name="sname" value="王王">property>
    4. <property name="gender" value="null">property>
    5. bean>

    测试:

    1. @Test
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. // Student student = ioc.getBean("studentTwo", Student.class);
    7. // Student student = ioc.getBean("studentThree", Student.class);
    8. Student student = ioc.getBean("studentFour", Student.class);
    9. System.out.println(student);
    10. }

     测试如下:加方法.getGender().toString()如果没有报错 那就说明是当前的null是字符的null

    但是如果null对象是空对象的话,变变成调用null.toString() ,所以要为某个成员变量赋值为null 以下这个地方不能写null

    正确写法:

    1. <bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    2. <property name="sid" value="1003">property>
    3. <property name="sname" value="王王">property>
    4. <property name="gender">
    5. <null>null>
    6. property>
    7. bean>
    8. 双标签里面没内容时可以设置成单标签
    9. <bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    10. <property name="sid" value="1003">property>
    11. <property name="sname" value="王王">property>
    12. <property name="gender">
    13. <null />
    14. property>
    15. bean>

     测试:

    1. @Test
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. // Student student = ioc.getBean("studentTwo", Student.class);
    7. // Student student = ioc.getBean("studentThree", Student.class);
    8. Student student = ioc.getBean("studentFour", Student.class);
    9. System.out.println(student.getGender().toString());
    10. }

     发现报了空指针  空指针对应行所操作的对象一定null   student不为null  所以为空的是getGender()

    xml 实体
    xml:是可拓展标记语言  语法类似HTML  HTML 的标签是提前定义好的   xml的标签是自己定义的
    所以在xml在标签或某些内容的时候。和HTML有一个共同的特点,如果有了一些 特殊的字符,是不能直接用的,一定要用他所对应的实体
    1. "studentFour" class="com.atguigu.spring.pojo.Student">
    2. "sid" value="1003">
    3. "sname" value="<王五>">
    4. "gender">
    5. <null />

    测试:

    1. @Test
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. Student student = ioc.getBean("studentFour", Student.class);
    7. System.out.println(student);
    8. }

    CDATA
    输入大写的CD,就可以写成 CDATA区
    写CDATA里面的内容都是原样解析的

     

    1. <bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    2. <property name="sid" value="1003">property>
    3. <property name="sname">
    4. <value>]]>value>
    5. property>
    6. <property name="gender">
    7. <null />
    8. property>
    9. bean>

     测试

    1. @Test
    2. public void testDI(){
    3. //获取IOC容器
    4. ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    5. //获取bean
    6. Student student = ioc.getBean("studentFour", Student.class);
    7. System.out.println(student);
    8. }

     

    以下是自学群 如果有自学的同学 可以加群讨论(禁广告)

    群不是引流群  不是引流群  不是引流群  

    也不是为了任何的利益  只是为了让大家学习上有个讨论的地方

    同时我也是一个菜鸟欢迎大神们可以多加指导(群里已经有很多大神  也多欢迎更多大神进群给小白一点指导哈哈哈哈)

      

     

     
    

     

     
    

  • 相关阅读:
    【sleuth + zipkin 服务链路追踪】
    Docker网络介绍
    设计模式—设计模式总览
    5G业务正式商用,属于广电的机会在哪?
    【2022】二进制方式部署etcd高可用集群
    spring的循环依赖
    ThreadLocal 详解
    一个Hive curator-client.jar包冲突问题排查解决
    Spring Cloud 综述
    RationalDMIS2022车削件(轴类)测量:回转体检测
  • 原文地址:https://blog.csdn.net/m0_59281987/article/details/127598632