什么是spring
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器 ,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架
spring重要特性
IOC:
(Inverse of Control ):一种思想 (容器帮我们创建对象并且管理和控制 )
反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。简单来说就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不在由类本身镜像控制,这就是IOC的本质
DI(Dependency Injection): 一种行为:意思是自身对象中的内置对象是通过注入的方式进行创建
实现DI:依赖注入可以通过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现,Spring支持setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter注入式更好的选择,setter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象
ioc与aop的关系:ioc就是一种思想,可以理解为容器,di就是注入这一行为,那么di确实就是ioc的具体功能的实现。而ioc则是di发挥的平台和空间。所以说。ioc和di即是相辅相成的拍档。他们都是为了实现解耦而服务的
AOP:面向切面编程 ,与业务逻辑无关的代码 日志、权限控制、事务管理 业务扩展,通过消息前置、后置跟业务无关的代码完成具体的功能
底层通过动态代理的方式进行实现,分为JDK代理与CGlib代理
动态代理是在你原有的功能基础之上,对功能进行增强的一种实现手段。通过动态代理,并且符合开闭原则的前提增强方法的功能。这也是AOP的思想,通过不修改原有代码,把你的代码织入到指定的方法中。
两种代理方式JDK代理与CGLib代理:
JDK代理的接口,而CGLib代理的类
spring生命周期
准备工作:
先获取对象的信息(主要通过xml文件或注解的方式),放入BeanDefiniton(存储的为Bean的属性、是否单例、名称、构造方法等信息)
1.实例化
将放入BeanDefiniton中的信息通过反射的形式进行创建对象(相当于在内存中开辟地址)存入map集合
2.初始化
将实例化后的对象进行属性赋值
自定义属性赋值:populateBean()
容器对象属性赋值:invokeAwareMethods()
在初始化的过程中有增强器的内容,:(目的是对对象进行扩展):使用BeanProcessor 进行扩展
前置处理方法与后置处理方法
前置处理器:BeanFactoryPostProcessor
在Bean对象实例化前,Spring会调用BeanFactoryPostProcessor接口的postProcessBeanFactory。
作用:
在这个阶段,spring刚刚完成了所有配置类的解析,完整的将所有的配置类转换成了对应的BeanDefinition。但是尚且没有完成Bean的实例化。在这个阶段,程序员可以对这些BeanDefiniton进行二次修改。
后置处理器
实现AOP
3.使用
通过getBean方法进行获取
4.销毁
1.判断是否实现了DispoableBean接口
2.调用destroyMethod方法
知识扩展
BeanFacotroy与FactoryBean的区别?
BeanFactory是spring的容器中的Bean工厂,Bean的创建,获取都是它来完成的,也就是说BeanFactory就是spring的容器,里面放入了所有的Bean,包括单例Bean,原型的Bean定义,也就是BeanDefinition,而BeanFactory中可以放入不同类型的Bean,(流水线)
而FactoryBean也是一种Bean,FactoryBean是BeanFactory的一种Bean,是一种特殊的Bean,FactoryBean中是只能放入一种类型的Bean。(私人定制)