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的初始化和销毁方法有三种: