spring的优点
  • 通过依赖注入和面向切面编程, 减小代码的入侵, 降低代码耦合度;
  • 融合第三方框架, 使用模板编程, 使其他框架的使用更加简单容易;
  • 通过IOC容器, 管理程序中的实体bean, 可以让我们拿来就用, 简化开发;
spring中Bean的状态
  • singleten: 单例模式, 整个应用只有一个对象
  • scope: 原型模式, 每次从容器中获取都会创建一个新的对象, 通常, 对于有状态改变的bean使用这种模式;
  • request: 在一次http请求中, 不论同容器中获取多少次, 都是同一个bean, 不同的http请求会获取到一个新的bean;
  • session: 和request类似, 只是他的作用域是在一个会话中;
  • globle session: 最后这一种情况不做讨论
AOP编程
主要是通过动态代理和cjlib代理实现
  • 权限认证
  • 采集日志
  • 数据库的事务管理
  • 异常捕获机制
spring的架构
spring核心模块
  1. spring-bean和spring-core, 主要实现了控制翻转和依赖注入, 而在这个实现过程中, BeanFacory是一个核心的接口, 也是spring的核心接口;
  2. spring-context: 该模块创建在核心模块之上, 扩张了BeanFactory, 并添加了spring的Bean生命周期控制, ApplicationContext是这个模块的核心接口;
  3. spring-experssion: 是spring的统一表达式扩展语言;
扩展模块
  1. spring的Aop和aspectj
  2. 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的生命周期

181453414212066.jpg
181454040628981.jpg

spring事务的基本概念
  1. 事务的属性: ACID 原子性, 一致性, 隔离性, 持久性
  2. spring事务的传播属性
  3. required: 支持当前事务, 如果当前没有事务, 则重新开启一个事务
  4. required_new: 不论当前是否存在事务, 都会另起一个事务, 两个事务相互独立, 外层事务失败, 不会影响内层事务的执行, 内层事务执行失败, 会抛出异常, 外层事务可以捕获, 自己决定是否处理
  5. support: 支持当前事务, 如果当前没有事务, 就以非事务执行
  6. mandatory: 支持当前事务, 如果当前没有事务则抛出异常
  7. not_support: 以非事务方式执行, 如果当前存在事务, 则将当前事务挂起
  8. never: 以非事务方式执行, 如果当前存在事务, 则抛出异常
  9. nested: 不做讨论
数据库的隔离级别
  1. 为提交读(uncommited): 当前事务读取到其他事务未提交的数据
  2. 已提交读(commited): 当前事务不能读取到其他事务未提交的数据, 但是在重复读取一个数据时, 出现同一个数据值不同的情况(被其他事务更改)
  3. 可重复读(repeatable-read): 当前事务可以重复读取一条数据, 并且保证数据的值相同, 但是不能避免增加和删除数据问题, 比如做区间数据统计和查询时, 会出现不同的情况
  4. 串行化读(serializable): 最严格的隔离别, 事务只能一个一个的执行, 效率很低
  5. 大多数的数据默认隔离别为commited已提交读(oracle, sqlserver), mysql默认的隔离级别为repeatable-read
spring中的隔离级别
  1. default: 使用数据库的隔离级别
  2. uncommited
  3. commited
  4. repeatable-read
  5. 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 接
口的核心理念。

  1. 代理模式:AOP 思想的底层实现技术,Spring 中采用 JDK Proxy 和 CgLib 类库。

红番茄
7 声望2 粉丝

« 上一篇
JVM笔记
下一篇 »
设计模式笔记