spring-IoC详解

spring-深入理解springioc

IOC理论

IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。
要想彻底理解IOC,首先思考这四个问题:

  1. 谁控制了谁
  2. 控制了什么
  3. 为何是反转
  4. 哪些地方反转了

所谓的IOC也就是spring的ioc容器负责对象的生命周期和对象之间的关系。
接下来举个例子说明一下
已找女朋友为例(对于程序猿来说这个值得探究的问题)。一般情况下我们是如何来找女朋友的呢?首先我们需要根据自己的需求(漂亮、身材好、性格好)找一个妹子,然后到处打听她的兴趣爱好、微信、电话号码,然后各种投其所好送其所要,最后追到手。如下:

/**
 1. 年轻小伙子
 */
public class YoungMan {
    private BeautifulGirl beautifulGirl;

    YoungMan(){
        // 可能你比较牛逼,指腹为婚
        // beautifulGirl = new BeautifulGirl();
    }

    public void setBeautifulGirl(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
    }

    public static void main(String[] args){
        YoungMan you = new YoungMan();
        BeautifulGirl beautifulGirl = new BeautifulGirl("你的各种条件");
        beautifulGirl.setxxx("各种投其所好");

        // 然后你有女票了
        you.setBeautifulGirl(beautifulGirl);
    }
}

这是我们最开始写代码的时候采用的方式,对象之间耦合太严重,这时候我就需要思考,我们所依赖的对象真的需要由我们自己创建吗?我们只是依赖对象的服务而不需要关注于这个对象是由我们自己创建的还是被人提供给我们的。
这个给我们送东西的“人” 就是 IoC,在上面的例子中,它就相当于一个婚介公司,作为一个婚介公司它管理着很多男男女女的资料,当我们需要一个女朋友的时候,直接跟婚介公司提出我们的需求,婚介公司则会根据我们的需求提供一个妹子给我们,我们只需要负责谈恋爱,生猴子就行了。你看,这样是不是很简单明了。
在这里插入图片描述
在没有引入 IoC 的时候,被注入的对象直接依赖于被依赖的对象,有了 IoC 后,两者及其他们的关系都是通过 Ioc Service Provider 来统一管理维护的。被注入的对象需要什么,直接跟 IoC Service Provider 打声招呼,后者就会把相应的被依赖对象注入到被注入的对象中,从而达到 IOC Service Provider 为被注入对象服务的目的。所以 IoC 就是这么简单!原来是需要什么东西自己去拿,现在是需要什么东西让别人(IOC Service Provider)送过来
现在再来回答那几个问题:

1、谁控制谁:在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了 IOC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象。
2、控制什么:控制对象。
3、为何是反转:没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。
4、哪些方面反转了:所依赖对象的获取被反转了
IOC Service Provider 为被注入对象提供被依赖对象也有如下几种方式:构造方法注入、stter方法注入、接口注入
Spring核心容器类图
BeanFactory
在这里插入图片描述
BeanFactory作为一个最顶层的接口类,它定义了一个IoC容器的基本功能规范,BeanFactory有三个最重要的子类ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory,从类图中发现DefaultListableBeanFactory实现了所有的接口。
为何要实现这么多的接口,查阅这些接口的源码和说明发现,每个接口都有它使用的场合。

public interface BeanFactory {


	//对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
	//如果需要得到工厂本身,需要转义
	String FACTORY_BEAN_PREFIX = "&";



	//根据bean的名字,获取在IOC容器中得到bean实例
	Object getBean(String name) throws BeansException;


	//根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;


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


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


	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;



	//提供对bean的检索,看看是否在IOC容器有这个名字的bean
	boolean containsBean(String name);


	//根据bean名字得到bean实例,并同时判断这个bean是不是单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;


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


	//得到bean实例的Class类型
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;


	//得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
	String[] getAliases(String name);

}

在beanfactory里面只对IoC容器的基本行为做了定义,不关注于具体实现,对于如何具体产生对象需要看spring的实现。如:ClassPathXmlApplicationContext、GenericApplicationContext
ApplicationContext
ApplicationContext是spring提供的一个高级IoC容器,它除了能提供IoC容器的基本功能,还为用户提供了各种附加服务。
在这里插入图片描述

  1. 支持信息源(实现了MessageSource接口)
  2. 访问资源(实现了ResourcePatternResolver接口)
  3. 支持应用事件(实现了ApplicationEventPublisher接口)

BeanDefinition
springIoC容器管理了我们定义的各种Bean对象及其对应的关系,bean对象在spring中是以BeanDefinition存在的
在这里插入图片描述
BeanDefinitionReader
bean的解析过程非常复杂,以后有时间再详细写下它的解析过程,比如解析import,bean各种标签。在这里插入图片描述

IoC运行的时序图
在这里插入图片描述
在这里插入图片描述
这是LZ的第一篇博文,没有经验,主要为了使自己深刻理解,会涉及参考别人的博文和书籍内容,如有雷同,纯属借鉴,当然 LZ 会标明参考来源。
参考文章:http://cmsblogs.com/?p=2652

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值