Spring模块
核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块
Spring Bean
-
bean 的生命周期
实例化一个bean , newset()设置属性
IOC依赖注入:按照Spring上下文对实例化bean进行配置
setBeanName实现:若Bean实现了BeanNameAware,会调用setBeanName(String id) ---- 配置文件中Bean的id
setBeanFactory(BeanFactory):若实现了BeanFactoryAware
setApplicationContext():若实现了ApplicationContextAware,传入Spring上下文
若实现了其他 *.Aware接口,就调用相应的方法。
如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
若Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
init-method:若配置此属性,会自动调用其配置的初始化方法
postProcessAfterInitialization:
destory过期自动清理阶段:若实现了DisposableBean,会调用destory()
destory-method:若配置此属性,会自动调用配置的销毁方法
-
bean 加载过程
(1)转换对应的beanName
final String beanName = transformedBeanName(name);
去除FactoryBean的修饰符 name="&aa" ----> name=“aa”
取指定alias所表示的最终beanName A指向B,B指向C---->返回C(2)尝试从缓存中加载单例
获取不到再从earlySingletonObjects里面获取
然后再次尝试从singletonFactory中加载
Object sharedInstance = getSingleton(beanName)(3)bean的实例化
从bean的实例中获取对象:getObjectForBeanInstance()
–getObjectFromFactoryBean() — doGetObjectFromFactoryBean() — object=factory.getObject()尽可能保证所有bean初始化后都会调用注册的beanPostProcessor.postProcessAfterInitialization方法进行处理
获取单例:
检查缓存是否已经加载过 :Object singletonObject = this.singletonObjects.get(beanName)
若没有加载,则记录beanName的正在加载状态
加载单例前记录加载状态—将当前正要创建的bean记录在缓存中,便可以对循环依赖进行检测:beforeSingletonCreation(beanName)
通过调用参数传入的ObjectFactory的个体Object方法实例化bean:singletonObject = singletonFactory.getObject()
加载单例后的处理方法调用—bean加载结束后移除缓存中bean的记录状态:afterSingletonCreation(beanName)
将结果记录至缓存,并删除加载bean过程中所记录的各种辅助状态:addSingleton(beanName,singletonObject)
返回处理结果(4)原型模式的依赖检查
只有在单例情况才尝试解决循环依赖(A中有B的属性,B中有A的属性)
原型模式下直接返回异常(5)检测parentBeanFactory
BeanFactory parentBeanFactory = getParentBeanFactory()
parentBeanFactory!=null && !containsBeanDefinition(beanName)
检测如果当前加载的XML配置文件中不包含beanName所对应的配置,只能到parentBeanFactory去尝试(6)将存储xml配置文件的GernericBeanDefinition 转换为RootBeanDefinition
如果指定beanname是子bean的话同时合并父类的相关属性
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName)(7)寻找依赖
若存在依赖则需要递归实例化依赖的bean
mbd.getDependsOn()(8)针对不同的模式进行bean的创建
实例化mbd
bean = getObjectForBeanInstance(instance,name,beanName,mbd);(9)类型转换
检测需要的类型是否符合bean的实际类型
BeanFactory 和 FactoryBean的区别
-
BeanFactory
工厂类,生产和管理bean的工厂。
是IOC容器的核心接口,实例化、定位、配置对象、建立对象间依赖
实现类:
DefaultListableBeanFactory
XmlBeanFactory(以XML方式描述组成应用对象及对象间的依赖关系)
ApplicationContext:扩展,更面向框架的方式工作以及对上下文进行分层和实现继承,还包括:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层;getBean():获取实例
-
FactoryBean
一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。用户可以通过实现该接口定制实例化Bean的逻辑
getObject()返回的对象
Spring IoC 控制反转
一种设计思想,将原本在程序中手动创建对象的控制权,交由Spring框架来管理。实现载体IoC容器,map结构,存放各种对象。
IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
DI:依赖注入,IoC最合理的实现方式
Spring AOP
面向切面编程,事务、日志、控制权限等,将一些业务逻辑封装起来。
基于动态代理
JDK Proxy(代理对象实现了某个接口)
Cglib (生成代理对象的子类作为代理)
Spring注解
-
@SpringBootApplication
@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。@Controller (返回一个页面) +@ResponseBody= @RestController (返回JSON 或 XML 形式数据)
-
将类声明为bean的注解:
@Bean 作用于方法
@Autowired自动装配bean
@Componect @Repository、@Service、@Controller@Scope 声明作用域
-
处理 http 请求: