Spring
作用:通过使用Spring提供的IoC容器,可以将对象之间的依赖关系交给Spring进行控制.方便解耦,简化开发.
IoC
IoC容器:
BeanFactory 是 Spring 最底层的接口.只提供了的 IoC 功能,负责创建、组装、管理 bean.在应用中,一般不使用 BeanFactory,而推荐使用 ApplicationContext
BeanFactory:需要等到获取某一个bean的时候才会创建该bean
ApplicationContext:在启动Spring容器的时候就会创建所有的bean,ApplicationContext接口继承了 BeanFactory.除此之外还提供 AOP 集成、国际化处理、事件传播、统 一资源价值等功能.
IoC:控制反转.把创建对象的控制权交给Spring来管理,只需要描述对象如何被创建(在配置文件描述),之后一个容器(IoC容器)负责把他们组装起来
Bean的作用域
指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围.
Singleton - 单例,缺省值.在 Spring IoC 容器中仅存在一个 Bean 实例,在开发中主要使用scope=”singleton”.
Prototype - 多例,每次从容器中调用 Bean 时,都返回一个新的实例.
Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效.
Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效.
Global-session - 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义.Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享.在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内.如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用.
Bean的初始化和销毁
init-method和destroy-method,一般用于连接池的初始化和销毁(关闭资源).
DI
DI注入:为IoC容器创建对象的时候,设置相关的属性值.
IoC是开发目的,DI是实现的手段.
注入方式有两种:
setter方法注入
构造器注入
注入值的类型:
常量值(简单类型) : value元素
对象(复合类型) : ref 元素
集合 : 对应集合类型元素
AOP
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.
代理模式的特点:
代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有关系.
代理模式的职责:把不是真实对象该做的事情从真实对象上撇开,职责清晰.
实现动态代理:
针对有接口:使用JDK动态代理.
针对无接口:使用CGLIB或Javassist组件
动态代理原理:
调用代理对象方法,在代理对象中插入增强代码.通过invoke方法,去调用真实对象中的真实方法,实现业务功能.
AOP思想:
AOP 把多个业务方法需要调用的代码封装到不同的模块中去(责任分离思想),使用动态代理机制来动态的增强业务功能,从而达到了代码的复用,也提高了维护性.
Joinpoint:通过在连接点插入代码,从而增强功能.
Pointcut(切点) : 指定哪些类的哪些方法上织入横切逻辑
Advice(增强) : 描述横切逻辑和方法的具体织入点
Advisor(切面) : 将Pointcut和Advice两者组装起来,有了Advisor信息,Spring就可以利用JDK/CGLIB动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象.
增强时机:
aop:before(前置增强):
在方法执行之前增强
aop:after-returning(后置增强):
在方法正常执行完成之后执行增强
aop:throwing(异常增强):
在方法抛出异常退出时执行增强
aop:after(最终增强):
在方法执行之后执行,相当于在finally里执行
aop:around(环绕增强):
可以在方法调用前/后完成自定义增强
事务管理
并发会导致以下问题:
第一类丢失更新:两个事务更新相同的数据,如果一个事务提交,另一个事务回滚,第一个事务也会回滚
脏读:第二个事务查询到第一个事务未提交的数据,第一个事务根据该数据进行操作,但是第一个事务却回滚了…
虚读:一个事务查询到另一个事务已经提交的数据,导致多次查询数据不一致.
不可重复读:一个事务查询到另一个事务已经修改的数据,导致多次查询不一致
第二类丢失更新:多个事务同时读取相同的数据,并且完成各种对该数据的操作提交,会导致最后一次的提交覆盖前面所有对数据的修改.
READ UNCOMMITED < READ COMMITED < REPEATABLE READ < SERIALIZABLE
Oracle 支持 READ COMMITED(缺省)和 SERIALIZABLE
MySQL 支持 四种隔离级别,缺省为 REPEATABLE READ(可重复读)
事务类型:
本地事务,分布式事务,JDBC 事务,JTA 事务
编程式事务:通过编写代码来管理事务
声明式事务:通过 注解 或 XML 配置来管理事务