spring的优点
- 通过依赖注入和面向切面编程, 减小代码的入侵, 降低代码耦合度;
- 融合第三方框架, 使用模板编程, 使其他框架的使用更加简单容易;
- 通过IOC容器, 管理程序中的实体bean, 可以让我们拿来就用, 简化开发;
spring中Bean的状态
- singleten: 单例模式, 整个应用只有一个对象
- scope: 原型模式, 每次从容器中获取都会创建一个新的对象, 通常, 对于有状态改变的bean使用这种模式;
- request: 在一次http请求中, 不论同容器中获取多少次, 都是同一个bean, 不同的http请求会获取到一个新的bean;
- session: 和request类似, 只是他的作用域是在一个会话中;
- globle session: 最后这一种情况不做讨论
AOP编程
主要是通过动态代理和cjlib代理实现
- 权限认证
- 采集日志
- 数据库的事务管理
- 异常捕获机制
spring的架构
spring核心模块
- spring-bean和spring-core, 主要实现了控制翻转和依赖注入, 而在这个实现过程中, BeanFacory是一个核心的接口, 也是spring的核心接口;
- spring-context: 该模块创建在核心模块之上, 扩张了BeanFactory, 并添加了spring的Bean生命周期控制, ApplicationContext是这个模块的核心接口;
- spring-experssion: 是spring的统一表达式扩展语言;
扩展模块
- spring的Aop和aspectj
- spring-jdbc, 数据访问
spring-tx 数据库的事务控制
IOC/DI
- ioc: 控制翻转, spring将原来由我们控制创建的对象, 来自己管理创建, 并将已经创建的对象添加到一个bean的容器中(实际上是一个concrrentHashMap);
- DI: 依赖注入, 我们可以从容器中获取到已经创建的bean对象, 并应用到我们的程序中;
spring IOC的核心实现BeanFactory
- BeanFactory是ioc容器的最顶层接口, 顾名思义, 这是一个创建Bean的工厂, 里面定义了Bean的各种操作, 最核心的方法就是getBean()方法;
- DefaultListableBeanFacrtory是实现了beanFactory所有功能的一个实现类
- BeanDefination: 该类的主要作用是用来定义或者描述一个bean
- Reader组件: 主要是用来读取解析我们的配置文件或者xml文件, 起到了定位的功能;
springIOC容器启动大致原理
xml文件, 当应用启动时, spirng的context会获取我们的xml文件, 并
用reader相关的组件对xml中定义的bean进行解析, 然后spring使用反射
机制, 创建bean的实例, 并用definationBean进行包装, 添加进IOC容
器中;
注解时, 和xml文件不同的是, spring需要获取一个包扫描的路径, 然后
扫描包下的class文件, 判断该class文件是否添加了bean相关的注解,
如果有, 则将该bean实例化, 包装, 最后添加到IOC容器中等待使用;
依赖注入
spring中bean的init-lazy默认为false
spring MVC基本原理
这里涉及到一个父子容器的问题, 实际上Web项目启动时, 有一个监听器, 会监听应用的启动, 此时会初始化一个ServletContext一个全局容器, spring的IOC容器
ApplicationContext和BeanFactory的区别
beanFactory: 是IOC容器的顶层接口, 定义了获取bean的各种接口, 但
是只是定义了跟bean有关的获取方法;
applicationContext: 是beanFactory的子类, 同时又实现了其他的接
口, 如MessageSource(消息的国际化), applicationEventPublisher
(消息发布), ResourceReader(资源读取)的接口, 相对于beanFactory,
applicationContext的功能更强大,是spring应用的核心接口, 获取
applicationContext的方法是实现ApplicationContextAware接口;
FactoryBean和BeanFactory
BeanFactory:Bean 工厂,是一个工厂(Factory),我们 Spring IOC
容器的最顶层接口就是这个BeanFactory,它的作用是管理 Bean,即实
例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
FactoryBean:工厂 Bean,是一个 Bean,作用是产生其他 bean 实
例。通常情况下,这种 bean 没有什么特别的要求,仅需要提供一个工厂
方法,该方法用来返回其他 bean 实例。通常情况下,bean 无须自己实
现工厂模式,Spring 容器担任工厂角色;但少数情况下,容器中的 bean
本身就是工厂,其作用是产生其它 bean 实例。
spring中Bean的生命周期
spring事务的基本概念
- 事务的属性: ACID 原子性, 一致性, 隔离性, 持久性
- spring事务的传播属性
- required: 支持当前事务, 如果当前没有事务, 则重新开启一个事务
- required_new: 不论当前是否存在事务, 都会另起一个事务, 两个事务相互独立, 外层事务失败, 不会影响内层事务的执行, 内层事务执行失败, 会抛出异常, 外层事务可以捕获, 自己决定是否处理
- support: 支持当前事务, 如果当前没有事务, 就以非事务执行
- mandatory: 支持当前事务, 如果当前没有事务则抛出异常
- not_support: 以非事务方式执行, 如果当前存在事务, 则将当前事务挂起
- never: 以非事务方式执行, 如果当前存在事务, 则抛出异常
- nested: 不做讨论
数据库的隔离级别
- 为提交读(uncommited): 当前事务读取到其他事务未提交的数据
- 已提交读(commited): 当前事务不能读取到其他事务未提交的数据, 但是在重复读取一个数据时, 出现同一个数据值不同的情况(被其他事务更改)
- 可重复读(repeatable-read): 当前事务可以重复读取一条数据, 并且保证数据的值相同, 但是不能避免增加和删除数据问题, 比如做区间数据统计和查询时, 会出现不同的情况
- 串行化读(serializable): 最严格的隔离别, 事务只能一个一个的执行, 效率很低
- 大多数的数据默认隔离别为commited已提交读(oracle, sqlserver), mysql默认的隔离级别为repeatable-read
spring中的隔离级别
- default: 使用数据库的隔离级别
- uncommited
- commited
- repeatable-read
- serializable
Spring 框架中的单例 Beans 是线程安全的么?
Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的 Spring bean 并没有可变的状态(比如 Serview 类和 DAO类),所以在某种程度上说 Spring 的单例 bean 是线程安全的。如果你的 bean 有多种状态的话(比如View Model 对象),就需要自行保证线程安全。
Spring 框架中都用到了哪些设计模式?
Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:
1、代理模式—在 AOP 和 remoting 中被用的比较多。
2、单例模式:在 spring 配置文件中定义的 bean 默认为单例模式。
3、模板模式:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
4、委派模式:Srping 提供了 DispatcherServlet 来对请求进行分发。
5、工厂模式:BeanFactory 用来创建对象的实例,贯穿于 BeanFactory / ApplicationContext 接
口的核心理念。
- 代理模式:AOP 思想的底层实现技术,Spring 中采用 JDK Proxy 和 CgLib 类库。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。