SpringIOC(实现+原理)

 原理

创建过程

在初始化一个Spring容器时,Spring会解析spring的配置文件(applicationContext.xml),从上到下解析到<bean id=””,class=””>时,根据标签中的class属性指定的类的全路径名找到该类并通过反射来创建该类的对象,并创建的对象存入到内置的Map容器中管理,其中存入map中的键是该标签中的id值,值是创建的对象。

获取对象过程

当通过getBean(id)方法来从容器中获取对象时,根据id从内置的Map中寻找是否有匹配的键值,如果有返回对象,如果没有抛出异常。

提示:默认情况下,多次获取同一个id的bean对象得到的是同一个对象(默认情况下创建的对象是单例的,如果需要多例可以该标签中设置多例)。如果使用容一个类配置多个<bean>标签设置不同的id ,每个id都会在内置Map中有一个键值对,其中的值是这个类创建的不同的对象。同一个<beans>标签下不允许配置多个同id的<标签>,如果配置会报错。

实现

首先创建lib目录导入需要依赖的包并buildpath:这些包可以spring官网下载也可以其他远程仓库可以下载。

提示:我们这里只是入门使用这种导入方式,后面不需要这样导入,开发中直接maven来自动导入)

依赖包导入后在指定包中创建一个Person类(为了使用创建对象)

package com.test.spring;

public class Person {
    public void say(String str) {
        System.out.println(str);
    }
}

然后在src目录下创建spring的配置文件applicationContext.xml。在这个配置文件中实现IOC控制反转,也是创建对象负责这个配置文件,我们不需要自己通过new关键字来创建对象。

<?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="person" class="com.test.spring.Person"></bean>
</beans>

在这里我们在<bean id=””,class=””>里面设置我们需要创建对象的类信息,class里面填写我们需要创建类的名,spring容器通过这个类名来找到这个类进行加载,然后通过id来给创建的对象设置id,我们使用的时候通过这个id来找到实力化的对象。id可以自定义设置例如:person1,person2,。。都可以,一般使用类名的小写使用。

注意:<beans >配置内容中不要多余的空格,会报错的,版本需要一致。按规范来写。

我们配置文件中配置好以后创建Person_test的测试类进行测试:

package com.test.spring;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Person_Test {
    @Test
    /**
     * SpringIOC获取对象
     * <bean id="person" class="com.test.spring.person">
     */
    public void test01() {
        //创建Spring容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过我们配置文件中面配置的beanid来获取对象:id="person"
        Person p = (Person)context.getBean("person");
        //调用对象的方法,并传人参数
        p.say("Hello SpringIOC");
        p.say("Spring控制反转");
    }
}

这里的@Test做测试使用的必要需要测试的方法上面插入再通过右键—Run as ---JUnit来Junit的方式运行,打印结果如下:

猜你喜欢

转载自www.cnblogs.com/jumpkin1122/p/11565282.html