Spring的IOC以及Bean管理

下面主要讲一下Bean管理即赋值的三种方法(设值注入,构造注入和自动装配)

项目结构如下图

实体类Student

package com.gxy.entity;/**
 * Created by 86157 on 2021/4/19.
 */

/**
 * @author 86157
 * @version 1.0
 * @description: TODO
 * @date 2021/4/19 15:45
 */
public class Student {
    private int sno;
    private String sname;
    private int age;
    private char gender;
    private Teacher teacher;

    public Student(int sno, String sname, int age, char gender, Teacher teacher) {
        this.sno = sno;
        this.sname = sname;
        this.age = age;
        this.gender = gender;
        this.teacher = teacher;
    }

    public int getSno() {
        return sno;
    }

    public void setSno(int sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno=" + sno +
                ", sname='" + sname + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", teacher=" + teacher +
                '}';
    }

    public Student() {
        super();
    }
}

实体类Teacher

package com.gxy.entity;/**
 * Created by 86157 on 2021/4/20.
 */

/**
 * @author 86157
 * @version 1.0
 * @description: TODO
 * @date 2021/4/20 15:42
 */
public class Teacher {
    private int tid;
    private String tname;
    private String tprofession;

    public Teacher(int tid, String tname, String tprofession) {
        this.tid = tid;
        this.tname = tname;
        this.tprofession = tprofession;
    }

    public int getTid() {
        return tid;
    }

    public void setTid(int tid) {
        this.tid = tid;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }

    public String getTprofession() {
        return tprofession;
    }

    public void setTprofession(String tprofession) {
        this.tprofession = tprofession;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "tid=" + tid +
                ", tname='" + tname + '\'' +
                ", tprofession='" + tprofession + '\'' +
                '}';
    }

    public Teacher() {
        super();
    }
}

applicationcontext.xml配置文件

<?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.2.xsd">

     <bean id="user" class="com.gxy.entity.Student">
         &lt;!&ndash;设值注入  setter  name与对应实体类中set方法名一致&ndash;&gt;
           <property name="sno" value="1907272110"/>
           <property name="sname" value="王秘书"/>
           <property name="age" value="20"/>
           <property name="gender" value="女"/>
           <property name="teacher" ref="teacher"/>
       </bean>
       <bean id="teacher" class="com.gxy.entity.Teacher">
           <property name="tname" value="王老师"/>
           <property name="tid" value="007"/>
           <property name="tprofession" value="国际抬杠教练"/>
       </bean>
        <!--构造注入 底层实现构造方法-->
    <bean id="user" class="com.gxy.entity.Student">
    <constructor-arg value="1907272110"/>
        <constructor-arg value="王秘书"/>
        <constructor-arg value="20"/>
        <constructor-arg value="女"/>
        <constructor-arg ref="teacher"/>
    </bean>
    <bean id="teacher" class="com.gxy.entity.Teacher">
        <constructor-arg>
            <value>3001</value>
        </constructor-arg>
        <constructor-arg>
            <value>刘世忠</value>
        </constructor-arg>
        <constructor-arg>
            <value>摄影</value>
        </constructor-arg>
    </bean>
    <!--DI 给对象类型赋值  自动装配-->
    <!--不能自动装配所谓简单类型例如基本类型,字符串和集合类   底层实现setter方法-->
    <bean id="autostu" class="com.gxy.entity.Student" autowire="byName">
        <property name="sno" value="1907272110"/>
        <property name="sname" value="王秘书"/>
        <property name="age" value="20"/>
        <property name="gender" value="女"/>
    </bean>
    <bean id="teacher" class="com.gxy.entity.Teacher" >
        <property name="tid" value="3001"></property>
        <property name="tname" value="王老师"></property>
        <property name="tprofession" value="地理"></property>
    </bean>
</beans>

测试类:

package com.gxy.test;/**
 * Created by 86157 on 2021/4/19.
 */

import com.gxy.entity.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 86157
 * @version 1.0
 * @description: TODO
 * @date 2021/4/19 15:47
 */
public class Test_01 {
    @Test
    public void method() {
        //spring是一个轻量级Ioc和AOP的容器框架    解决类与类之间的解耦合
        // 加载spring配置文件,创建工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据配置文件中的bean id,获取对象
        Student stu = (Student) context.getBean("autostu");
        //输出
        System.out.println("stu = " + stu);
    }
}

Spring,IOC概念:

spring是一个轻量级Ioc和AOP的容器框架    用来解决类与类之间的解耦合  降低企业开发的复杂性

IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译成为“控制反向”或者“控制倒置”。

个人理解IOC就是对象原来是由程序员创建的,现在交给Spring去处理,但是你要告诉他怎么来创建。

bean就是由IOC容器初始化,装配及管理的对象。

Bean装配:

接下来主要描述三种方法即设值注入,构造注入和自动装配

Bean装配之设值注入:

bean标签中id为标识符,随后会在applicationcontext获取对象时用到,property标签用来给对象赋值,name为实体类中属性名,对于对象类型,使用ref引入,ref通过唯一标识符来查找对象

测试类运行结果如下:

底层实现目前看不出来,现在在实体类中setter,getter,构造方法中加入提示,如下:

现在再来运行下看看结果

从上面我们可以看出来运行后,读取配置文件首先创建了对象,然后调用setter方法进行赋值,由此我们可以得出结论

设值注入底层实现:setter

Bean装配之构造注入:

使用构造注入时,不需要写类中属性名,但是需要按照有参方法中的参数顺序进行依次赋值,否则报错如:

会提示转换值时候报错,也就是说你这个类中类型和你赋值的类型不一致,转化失败,现在正常运行下

构造注入底层实现:构造方法

Bean装配之自动装配:

TIP:DI 给对象类型赋值  自动装配,不能自动装配所谓简单类型例如基本类型,字符串和集合类

autowire属性即自动装配,属性有以下:

这里演示byname即通过名字,通过实体类中对象类型的名字进行装配

运行如下:

自动装配底层实现:setter

总结到此为止,如有错误,欢迎多多指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值