spring专题---第一部分IOC(一)

spring专题---第一部分IOC(一)_第1张图片
IOC简单介绍
ioc被称作控制反转,也被称为依赖注入(DI)。是spring中重要的一部分,它是spring框架的重要组成之一,我们可以将ioc比作一个容器,而它的作用就是帮助我们new 对象,管理对象的。
控制反转理解
那么我将自己对控制反转的理解简单说一下,控制反转其实是spring中的一种机制,我们之前是怎么创建对象的?简单来说就是自己手动去new,当我们想对该对象进行一些属性的操作呢?我们就会通过构造函数,属性调用对其赋值,而IOC会怎么来帮助我们创建对象呢?首先分为两种,一种是无参创建,还有一种是有参创建,无参创建我们可以理解为无参构造函数创建对象,不对其进行任何属性赋值,有参便是通过有参构造函数创建对象,将对其属性进行一些赋值。
简单用图说明一下控制反转:
传统方式:
创建对象----->对对象进行一些属性赋值
spring ioc:
要对对象赋的值---->给ioc容器----->ioc容器依据属性创建对象(注意ioc创建对象也是利用构造函数,因此需要创建的对象的类必须有构造函数)
如此我们可以体会到控制反转的精妙之处,这也是spring框架的一大特色。
创建对象的方式
创建对象有多种方式,这里我只介绍两种,一种是传统方式创建,当然传统方式里也有多种,我只介绍最简单的一种,通过构造函数创建,仅仅是用来区别spring ioc容器创建。
传统方式创建:
(1)创建student类

public static Student{
      private int id;
      private String name;
      private int age;
      //无参构造函数程序默认给出
}

这里自行实现setter,getter,toString方法。
(2)测试方法调用构造函数创建对象

Student student=new Student();

IOC容器创建对象
实现步骤:
(1)在pom.xml中添加spring依赖

   >
        >
            >org.springframework>
            >spring-context>
            >${spring.version}>
        >

        >
            >org.springframework>
            >spring-beans>
            >${spring.version}>
        >
    >

(2)创建配置文件,可以自定义文件名,比如spring.xml
(3)在spring.xml中配置bean标签,IOC容器通过加载bean标签来创建对象
(4)调用API获取IOC创建的对象
IOC容器创建对象同样有两种,无参构造和有参构造,无参和有参构造我在上边已经解释了,不理解的同学可以再往上看一看。
IOC容器通过无参构造方式创建对象

<!--配置Student对象,IOC通过这个bean来创建对象-->
>
<!--id可以理解为这个bean的名字,后面会用到,class是上面创建Student类的目录路径-->

接下来我们通过调用API来获取对象,Spring提供了两种方式来获取对象,一种是id,一种运行时类
通过id获取对象

public class ApplicationContext {
    public static void main(String[] args){
        AbstractApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        //通过id获取对象
        Student stu=(Student)applicationContext.getBean("stu");
        System.out.println(stu);
        //通过运行时类获取对象
        Student stu1=applicationContext.getBean(Student.class); //此时可不声明强转,因为我们是通过类的反射机制获取的,但是也有弊端
        System.out.println(stu1);
    }
}

这里注意需要导包。
运行结果:
在这里插入图片描述
通过上图我们可以看到,通过无参构造方式创建的对象属性值都是0或null,这也证明了一点IOC确实是通过构造函数来创建对象的,那么我们让其属性具有一些值呢?这里我们需要在bean标签中添加property属性,我们可以理解为传统方式的属性调用。下面我们举例说明以下:

    >
        >>
        >>
        <!--age值我不进行操作,以此来说明property的作用-->
    

运行结果:
spring专题---第一部分IOC(一)_第2张图片
我们可以看到,id和name均已有值,而age还是无值状态。
IOC容器通过有参构造方式创建对象
(1)在实体类中创建有参构造

public class Student {
    private int id;
    private String name;
    private int age;
    
    //创建有参构造函数
    public Student(int id,String name,int age){
        this.id=id;
        this.name=name;
        this.age=age;
    }

(2)在spring.xml中进行配置

    >
        -arg name="id" value="3">-arg>
        -arg name="name" value="jacob">-arg>
        -arg name="age" value="18">-arg>
    >
    <!--注意这里一定要写constructor-arg,不然会报错,报错原因是当我们写出有参构造函数时,程序中默认的无参就不存在了-->

运行结果:
spring专题---第一部分IOC(一)_第3张图片
这里补充一点,我们之前在写项目的时候遇到很多类中包含类的情况,也就是级联关系,那么ioc容器怎么处理呢?我们一起来看看吧!
spring专题---第一部分IOC(一)_第4张图片
在spring.xml中,通过ref属性将其他bean赋给当前bean对象,这种方式叫做依赖注入(DI),是spring非常重要的机制,DI是将不同对象进行关联的一种方式,是IOC的具体实现方式,所以IOC和DI通常是紧密结合在一起的,因此一般说IOC包括DI。
总结:
IOC可以理解为一个能创建对象的容器,它具有控制反转和依赖注入的特性,控制反转就是依据属性值创建对象,依赖注入就是将两个不相关的对象联系起来,让其中一个对象包含在另一个对象之中。IOC容器创建对象有两种方式,一种是无参构造一种是有参构造,我们都可以将它们理解为之前我们所学的有参构造函数和无参构造函数创建对象,这也证明了IOC其实也是通过构造函数来创建对象的,IOC容器通过加载spring.xml配置文件来创建对象,之后我们通过API来获取这些对象,获取方式也有两种,一种是通过id来获取,另一种是通过类.class来获取,虽然获取结果一样,但后者有一些弊端,那就是假如在spring.xml配置文件中有两个Student的bean,程序就会报异常,因为此时两个bean都是由Student类生成的,IOC容器无法将两个bean都返回,必须指定一个唯一的bean。我们需要注意IOC是通过构造函数来创建对象的,所以所需创建的对象类必须有构造函数,且必须有setter方法。
以上便是我对这一部分的理解,如果有错误或者你有其他疑惑都可以留言给出,我都会一一进行回复,希望对你有所帮助,如果写的不好也请您多多包涵。欢迎在下方补充留言哟。

对SSM框架感兴趣的童鞋,可以移步这里,在这里你可以快速的搭建好一个SSM框架。

你可能感兴趣的:(spring)