Spring笔记(一)
什么是Spring?
Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的平台。它能帮助开发者解决基础性的问题,使得开发人员能更专注于程序的开发,大大提高了效率。
Spring集成了20多个模块,体系结构如下图所示:
spring又被称为容器或者大管家,其主要核心有:
- 控制反转(IOC–Inversion of Control)
- 依赖注入(DI–Dependency Injection)
- 面向切面编程(AOP–Aspect Oriented Programming)
1.IOC
Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化
Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供
了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。
其优点有以下一些:
- 对象之间的解耦,不必自己实例化,如需更改对象,只需更改配置文件里的信息
- 提高程序拓展性,若后期需要添加新的类,可以在原先的类上继承下来,原先代码不需要改动
- 支持加载服务时的饿汉式初始化和懒加载,每个对象只实例化一次
缺点:
- 对象的创建过程变得复杂
- 底层使用解析xml+反射完成,对程序性能有一点影响
IOC源码分析:核心是BeanFactory、BeanDefinition 、BeanPostProcessor 、xml解析(XmlBeanDefinitionReader )+反射
参考:
再来看看spring的Bean的作用域:
2.DI
spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属
性自动设置所需要的值的过程,就是依赖注入的思想
在spring中,给对象的属性赋值的几种方式:
- 通过构造方法
- 通过set方法
- 静态工厂注入
- 实例工厂注入
- 注解(属性注入,最常用)
五种自动装配的方式:
- no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
- byName:通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
- byType::通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,
之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。 - constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类
型,将会抛出异常。 - autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
3.AOP
面向切面的编程, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。
AOP的实现原理:动态代理
- JDK动态代理:基于接口
- CGLIB动态代理:基于继承
详情可参考我的另外一篇博客:动态代理的两种实现方式,或者一个大牛写的这篇:Spring AOP实现原理
AOP的几个名词的概念:
- 切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。
- 连接点(Joinpoint) :程序执行过程中的某一行为。
- 通知(Advice) :“切面”对于某个“连接点”所产生的动作。共有五种通知类型
- before:前置通知,在一个方法执行前被调用。
- after: 在方法执行之后调用的通知,无论方法执行是否成功。
- after-returning: 仅当方法成功完成后执行的通知。
- after-throwing: 在方法抛出异常退出时执行的通知。
- around: 在方法执行之前和之后调用的通知。
- 切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。
- 目标对象(Target Object) :被一个或者多个切面所通知的对象。
AOP的源码分析推荐这篇博客:
4.小结
Spring的核心就是IOC和AOP,搞懂了这几个,Spring就算基本掌握了,最后推荐一点干货