SpringFramework的核心:IOC容器的实现------Spring IOC容器概述

版权声明: https://blog.csdn.net/qq1641530151/article/details/82348866

        之前在刚开始学习的时候,我曾经尝试过研究《Spring技术内幕》这本书,但是由于当时的经验以及知识储备不足。导致我没有很好地完成阅读这本书,这本书是对于spring源码的很好的分析。所以现在在我已经学完spring之后我想回顾一下,重新审视spring,从底层的角度更好地了解这个框架。

        我曾经写过一篇关于spring ioc容器的文章,但是当时对于spring的理解还非常肤浅,导致自己的写的文章就像是从书上直接摘抄一样而没有自己的思想。所以现在我想重写来研读这本书并把我的一些个人感受写出来。

       在讲IOC容器的实现之前,我觉得我们有必要了解一下什么IOC到底是什么?

       IOC(Inversion of  Controll)控制反转,又叫做依赖注入。什么意思呢。举个例子,我们都使用过mvc模式进行过开发项目。我们需要在Controller层里面调用Service层的方法,那么我们需要在Controller层实例化一个Service层的对象。那么我们来想一下,这个Service层的实体对象的控制权在谁的手中呢,就是Controller层,因为我们知道在Service层对象是通过new来进行实例化的。那么这样就会出现Controller层和Service层的代码耦合性过高,无法进行很好的测试。为了实现代码的低耦合高内聚,我们引入了依赖注入这一思想。将一个对象中所依赖的对象交给一个外部的容器或者工厂来统一进行管理。当我们的一个对象在实例化时需要获取这其中的对象时,我们可以从外部的容器或者工厂中获取相对应的依赖(实体)。

       那么Spring中的IOC容器有哪些呢,总体来看有两个大类一个是BeanFactory,一个是ApplicationContext。

       

/**
	 * Used to dereference a {@link FactoryBean} instance and distinguish it from
	 * beans <i>created</i> by the FactoryBean. For example, if the bean named
	 * {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject}
	 * will return the factory, not the instance returned by the factory.
	 */
	String FACTORY_BEAN_PREFIX = "&";

        这是我从BeanFactory中截取的一段代码,这段代码的意思是。我们可以使用&转义字符获取FactoryBean本身而不是FactoryBean的对象。

          这个地方引入了FactoryBean。那么FactoryBean和BeanFactory有什么区别呢?

         FactoryBean是一个工厂bean,它可以产生或者修饰一个对象,让这个对象成为我们的工厂或者容器需要的对象。

         BeanFactory是一个工厂,它是用来管理这些bean的。

         下面我想对BeanFactory的方法进行说明:

              首先关于BeanFactory,有四个getBean方法。

             (1)

              通过bean的名称来获取一个bean

Object getBean(String name) throws BeansException;

            (2)通过bean的名称以及bean的类型来获取一个bean

<T> T getBean(String name, Class<T> requiredType) throws BeansException;

            (3)通过bean的类型来获取一个bean

	<T> T getBean(Class<T> requiredType) throws BeansException;

             (4)通过bean的类型和传入一些参数来获得一个bean,这个调用了bean的构造方法

Object getBean(String name, Object... args) throws BeansException;

另外用户还可以根据自己的需求做出以下操作:

  1.  判断指定名字的bean是不是单例模式

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

2.判断指定名字的bean是不是prototype类型

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

3.判断制定了名字的Bean的Class类型是否是特定的Class类型。

boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

4.根据名字获取bean的类型

Class<?> getType(String name) throws NoSuchBeanDefinitionException;

5.查询指定了名字的Bean的所有别名

String[] getAliases(String name);

这些就是关于IOC容器的简要概述。

猜你喜欢

转载自blog.csdn.net/qq1641530151/article/details/82348866
今日推荐