Spring
Bean细节
1. 控制简单对象单例,多例模式
在spring配置文件中配置<bean scope="singleton"|"prototype">
默认singleton单例模式 改成prototype则是多例
2. FactoryBean创建复杂对象【了解即可】
不可以直接new创建对象,反射也不可以创建,需要通过FactoryBean来创建对象
2.1 实现FactoryBean接口
2.2 配置spring-context.xml
2.3 测试
Spring工厂特性
1. 饿汉式创建优势
当工厂创建完成后,Spring配置文件的bean对象都会一起创建,这样提高了程序的运行效率,减少多次的IO以及创
建对象的时间,类似于连接池,创建好一次,就可以直接获取(单例)
多例不可以直接创建
2. 生命周期方法
- 自定义初始化方法:添加"init-method"属性,Spring的bean创建就会调用此方法
- 自定义销毁方法:添加"destroy-method"属性,Spring的bean销毁之前调用此方法
- 销毁:工厂close()方法调用后,会销毁已经创建的单例模式的对象
- 分类:singleton对象由Spring容器销毁,Prototype对象由jvm销毁
3. 生命周期注解
注解就先不详细谈,后面会讲到
4. 生命周期阶段
单例singleton
工厂启动 创建-----》构造方法-------》set方法------》init初始化------》构建完成-------》工厂关闭 destroy销毁
多例prototype
被使用时创建-----》构造方法-------》set方法------》init初始化------》构建完成-------》jvm垃圾回收 destroy销毁
代理设计模式
1. 概念
在核心功能不改变的情况下,通过代理类添加辅助辅助功能,简单说就是你要打官司,你要请一个律师代理来帮你打官司
2. 静态代理设计模式
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。 已经写死状态
静态代理类:只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。
3. 动态代理设计模式
动态:在程序运行时运用反射机制动态创建而成。
动态代理:是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象,可以一个来代理类完成全部的代理功能
3.1 jdk动态代理实现(基于接口)
3.2 CGlib动态代理实现(基于继承)
面向切面编程
1.概念
就是通过代理类动态地向指定的核心方法加入辅助功能,对原有代码毫无侵略性
2.AOP开发术语
- 连接点:简单来说就是方法
- 切点:需要增强处理的方法
- 通知,增强处理:对切点进行添加辅助功能操作
- 织入:把增强处理的目标对象来创建代理类对象的过程
- 引介:一种特殊的通知,在不修改类代码的前提下,可以在动态运行期间为类添加Method/Field
- 切面:切点和通知结合
- 目标对象:需要被增强的对象
- 代理对象:目标对象在织入后产生的对象
3.作用
在不改变原有代码的情况下,增强业务的功能
4.环境搭建
1.在pom.xml添加aop依赖
2.在spring配置文件加入aop约束
5.开发流程
1.定义目标对象
2.定义通知类
3.在spring配置文件创建目标类和代理类的bean对象
4.在spring配置文件定义切面来织入
5.测试类
6.通知类
- 前置通知类 MethodBeforeAdvice
- 后置通知类 AfterAdvice 父类 //都执行
- 后置通知类 AfterRuturnigAdvice 子类//核心业务有异常不执行
- 异常通知类 ThrowsAdvice 子类//核心业务有异常执行
- 环绕通知类 MethodInterceptor
7.切入点表达式
expression=“execution(xxxxxx)”;
xxxxx:【修饰符 返回值 包.类 方法名 参数表】
8.JDK和CGLIB的选择
spring底层包含了jdk和cglib代理的两种动态代理生成机制
基本规则,如果目标类有接口则使用jdk,否则使用cglib
9.后处理器
9.1 后处理器的理解
就是对bean生命周期的干预和调整
9.2 配置后处理器
1.创建处理器类
2.spring配置文件配置后处理器
3.启动工厂开始bean生命周期
动态代理的生成时刻是在目标bean的后处理过程中去额外生成的一个动态代理可以解释为什么工厂中会额外生成一个动态代理的原因
9.3 bean的生命周期
完整的bean生命周期
构造器 =》set注入=》 后处理器前置过程 =》初始化=》后处理器前置过程=》构建完成返回=》销毁(需要调用close方法)
总结
spring作为一款非常优秀的框架,在以后的工作当中尤其java开发方向的同学们,尤为的重要,这也是为什么我想写在csdn跟同学们一起学习,加油吧骚年,学习改变命运!
下一篇:Mybatis