3.3-IoC

优质
小牛编辑
119浏览
2023-12-01

在上文 Tomcat 实现 根据 web.xml 文件配置和浏览器请求,生成对应的 Servlet 响应请求的基础上,本文主要思考的问题是 Spring 中的对象依赖关系管理(IoC)如何实现。

1. 实现功能

1.1 配置依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
    </dependencies>

1.2 初始化方法

1.2.1 配置文件方法

1.2.1.1 xml 文件

1.2.1.2 测试类

ApplicationContext applicationContext=new ClassPathXmlApplicationContext(".xml");
Bean bean=applicationContext.getBean()

1.2.2 配置类实现

1.2.2.1 定义配置类

@Configuration 
public class XXXConfig(){
   @Bean
   public Bean method1(){
       return new Bean()
   }
}

1.2.2.2 测试类

ApplicationContext applicationContext=new AnnotationConfigApplicationContext("XXXConfig");
Bean bean=applicationContext.getBean(Bean.class);

1.2.3 注解实现

1.3 注入方法

1.3.1 构造器注入

  • 在实现类中定义构造器。
    public BlankDisc(String title, String artist, List<String> tracks) {
          this.title = title;
          this.artist = artist;
          this.tracks = tracks;
      }
    
  • 使用配置文件或 Configuration 进行配置。
    <bean id="compactDisc"
            class="com.iecas.soundsystem.impl.BlankDisc"
            c:artist="tjj"
            c:title="my love">
          <!--使用构造器注入 -->
          <constructor-arg>
              <list>
                  <value>1</value>
                  <value>1</value>
                  <value>1</value>
                  <value>1</value>
              </list>
          </constructor-arg>
      </bean>
    
  • 使用 @Autowired 注解引用接口。

    1.3.2 setter 方法注入

    1.4 常见的注解

    | 名称 | 参数 |功能 |配置实现|
    | ------ | ------ | ------ |------| | Configuration | 接口 | 指定该类为 bean 配置类。 || | Bean | value,默认参数 | 指定 bean 名称。 || | ComponentScan | | 指定扫描的组件(标注@Component、@Controller、@Service、@Repository)所在包。 |context:component-scan| ||excludeFilters={}|指定排除的组件|| ||includeFilters={},useDefaultFilters=false|指定包含的组件|| | FileSystemXmlApplicationContext | 类 | |

    2. 实现原理

    | 方法 | 类型 |功能 |
    | ------ | ------ | ------ | | BeanFactory | 接口 | 主要定义了作为容器具备的基本功能。 | | XmlBeanFactory | 接口 | 主要是 | | ApplicationContext | 接口 | | | FileSystemXmlApplicationContext | 类 | |

2.1 BeanFactory

BeanFactory定义的功能

</br>

方法功能
Object getBean(String name)根据 bean 名称获取注册的 bean 对象
T getBean(String name,Class requireType)根据 bean 名称和Type属性 获取注册的 bean 对象
Object getBean(String name,Object... args)根据 bean 名称和参数 获取注册的 bean 对象
boolean containsBean(String name)根据 bean 名称判断 bean 对象是否已注册。
boolean isSinggleton(String name)根据 bean 名称判断 bean 对象是否为单例。
boolean isPrototype(String name)根据 bean 名称判断 bean 对象是否为多例。
boolean isTypeMatch(String name,Class targetType)根据 bean 名称判断 bean 对象是否为给定类型。
Class getType(String name)根据 bean 名称查询 bean 对象的类型。
String[] getAliases(String name)根据 bean 名称查询 bean 对象的别名。

2.2 XmlBeanFactory 的初始化

  • 调用 成员变量 reader 的loadBeanDefinitions(resource) 方法根据 resource 对象生成 Definition 对象。

    2.3 ApplicationContext 接口

    2.4 FileSystemXmlApplicationContext 实现

    2.5 IoC 容器的初始化过程

    2.5.1 BeanDefinition 的 Resource 定位

    FileSystemResource

    ClassPathResource

    2.5.2 BeanDefinition 的载入和解析

    把用户定义好的 Bean 表示成 IoC 容器的内部数据结构(BeanDefinition)。 BeanDefinition 是 POJO(Controller、Service、Dao) 对象在 IoC 容器中的抽象。

参考资料

  • Spring Framework 的核心:IoC 容器的实现