从根上理解Spring之容器

Spring基础

spring解决了什么问题?

Spring是为了解决企业应用的开发的复杂性而创建的,它使用基本的JavaBean来完成以前只可能由EJB完成的事情。

个人理解:Spring就是一些大牛利用java语言规范开发的一个框架,我们开发者只需要学习其基本使用方式,原理就可以帮助我们提高效率,简化开发的复杂性。

Spring的基本架构是什么?

Spring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块。

个人理解:最简单的理解,Spring作者们开发了20个jar包,每个jar包具有不同的功能,用于解决不同的问题,作为开发者,你需要哪个功能引入哪个jar包即可

Spring容器是什么?

最简单的Spring容器就是如下代码:Spring容器的核心功能就是创建Bean。
所以,BeanFactory就是提供Bean,你需要就去它那里获取。

public class BeanFactory {
	private Map<String, Object> beanMap = new HashMap<>();

	public void registerBean(String name, Object bean) {
		beanMap.put(name, bean);
	}

	public Object getBean(String name) {
		return beanMap.get(name);
	}
}
复制代码

BeanDefinition是什么?

上面讲了BeanFactory就是一个工程,我们需要bean的时候就去问它要,但是它是怎么生产bean的呢?
生产一个东西,肯定需要先描述一个东西,BeanDefinition就是用于描述bean信息的类。比如:bean的Class类型(生产的时候就是通过这个东西反射生成的实例),构造参数,属性值等信息。 我现在给你提供一个BeanDefinition,你也能创建一个bean出来。

BeanDefinitionRegistry是什么?

上面讲了BeanDefinition的作用,但是BeanFactory要想创建多种bean,那就需要多个不同的bean的描述即BeanDefinition,那这么多的BeanDeifnition也需要进行管理啊,BeanDefinitionRegistry就是用来管理BeanDefinition的,包括获取,添加等围绕BeanDefinition进行的各种CRUD操作。

Bean实例化策略?

回想一下,如果让我们自己创建一对象,我们最起码有两种方法,一种是无参构造,一种是有参构造。Spring针对bean的实例化,抽象出一个实例化策略的接口InstantiationStrategy,有两个实现类:

  • SimpleInstantiationStategy,使用bean的构造函数来实例化
  • CglibSubclassingInstantiationStrategy,使用CGLB动态生成子类

为bean填充属性?

现在我们已经将bean实例化了,那么就要进行填充属性了,大家想一下这个属性Spring需哪里找? 就是在BeanDefinition中定义了许多属性,在这里通过反射将属性设置进去就行了

资源和资源加载器?

通过我们以上讲解,如果没有BeanDefinition,Spring这个工程什么都生成不了,那BeanDefinition是怎么来的?这就需要我们使用Spring框架进行开发的程序员告诉Spring了,最好理解的就是我们配置的xml了,我们在xml中使用规范的标签定义了很多bean的信息,Spring加载这个xml文件,解析,读取其中的信息,解析为BeanDefinition就可以了。但是Spring作为这么强大的框架,即使是读取xml这么一件事也进行很多的设计,简单理解如下:

  • Resource 是资源抽象和访问接口
  • FileSystemResource 文件系统的资源实现类
  • ClassPathResource classpath下资源的实现类
  • UrlResource 对java.net.URL进行资源定位的实现类

BeanFactoryPostProcessor是什么?

这个接口很重要,先翻译一下,PostProcessor就是后置处理的意思。
BeanFacotoryPostProcessor是Spring提供的扩展机制,允许我们在bean实例化之前修改bean的定义的信息即BeanDefinition的信息。这个能干什么?它有以下两个实现,看完你就明白了

  • PropertyPlaceholderConfigurer 该类的作用是将properties文件的配置值替换xml文件中的占位符
  • CustomEditorConfigurer 该类的作用是实现类型转换的。

BeanPostProcessors是什么?

这个接口也很重要,注意和上一节中的接口进行区分。 BeanPostProcessor也是Spring提供的扩展机制,不同于BeanFactoryPostProcessor的是,BeanPostProcessor在Bean实例化后修改bean或替换bean。注意这一点,这是AOP实现的关键。 简单讲一下,AOP就是你去工厂获取bean的时候,在这一步中Spring发现这个bean不能直接返回,而是需要返回一个代理,所以spring利用动态代理技术生成一个代理返回给你,就是利用的BeanPostProcessor可以在bean实例化后可以替换bean的这个特定。

应用上下文ApplicationContext?

应用上下文ApplicationContext是Spring中较之于BeanFactory更为先进的IOC容器。先进是什么意思?就是ApplicationContext除了拥有BeanFacotory的所有功能外,还支持特殊类型bean如上面提到的BeanFactoryPostProcessor和BeanPostProcessor的自动识别,资源加载,容器事件和监听器,国际化支持,单例bean自动初始化等。
BeanFactory是Spring的基础设施,面向Spring本身;而ApplicationContext面向Spring的使用者,应用场合使用ApplicationContext

Bean的初始化和销毁方法?

这个很重要,工作中十分常用。
在Spring中,定义bean的初始化和销毁方法有三种:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值