概念:
一个开源框架
简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能
是JavaSE/EE一站式框架
优点:
方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持
Spring提供面向切面编程,可以方便实现对程序进行权限拦截,运行监控等功能
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序测试
Spring对Junit4支持
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架
降低了Java EEAPI的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC,JavaMail,远程调用等),都提供了封装,使这些API应用难度大大降低
SpringIOC底层实现原理
工厂模式+配置文件+反射
ocp原则:open-close原则,对程序进行扩展open,对修改程序代码是close
添加Springjar包:
Spring的工厂类:
BeanFactory只有调用getBean时才实例化,ApplicationContext在加载配置文件时所有单例模式生成的类全部实例化
Spring的Bean管理(XML方式)
使用类构造器实例化(默认无参数)
使用静态工厂方法实例化(简单工厂模式)
使用实例工厂方法实例化(工厂方法模式)
Spring的Bean管理(注解方式)
@Component描述Spring框架中Bean
@Repository用于对Dao层实现类进行标注
@Service用于对Service实现类进行标注
@Controller用于对Controller实现类进行标注
使用@Autowired进行自动注入
@Autowired默认按照类型注入,如果存在两个相同的Bean类型,按照名称注入
@Autowired注入时可以针对成员变量或者set方法
@Autowired的required属性,设置一定要找到匹配的Bean
使用@Qulifier指定注入Bean的名称
使用Qualifier指定Bean名称后,注解必须指定相同的名称
Spring其他注解
Spring初始化Bean或者销毁Bean时,有时候需要做一些处理工作,因此Spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法
初始化:@PostConstruct
销毁:@PreDestory
XML与注解的整合开发
1.引入context命名空间
2.在配置文件中添加context:annnotation-config标签
Bean的常用配置
id和name
一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
id属性在IOC容器中必须是惟一的,name没有唯一性约束,使用时要唯一
如果Bean的名称有特殊字符,必须使用name
class
用于设置设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
scope
Spring容器作中Bean的生命周期
Spring初始化Bean或销毁Bean时,有时需要做一些处理工作
init-method:当Bean被载入到容器的时候调用init
destory-method:当Bean从容器中的删除的时候调用destory(scope=singleton有效)
Spring属性注入
1.构造函数注入
2.属性setter方法注入
3.接口注入
Spring支持前两种
SpringAOP:
采用横线抽取机制,取代了传统纵向继承体系重复性代码(性能监视,事务管理,安全检查,缓存)
连接点:被拦截的点,在Spring中,这些点指的是方法,因为spring只支持方法类型的连接点
切入点:对那些连接点进行拦截的定义
通知/增强:拦截到joinpoint之后所要做的事情就是通知
引介:一种特殊的通知在不修改类代码的前提下,可以在运行期为类动态的添加一些方法或者Field.
目标对象:代理的目标对象
织入:把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
代理:一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面):切入点和通知(引介)的结合
JDK动态代理 :
CGLB动态代理:
对于不使用接口业务类,无法使用JDK动态代理
CGLB采用非常底层的字节码技术,可以为一个类创建子类,解决无接口代理问题
代理知识总结:
1. Spring在运行期,生成动态代理对象,不需要特殊的编译器
2.Spring AOP的底层就是通过JDK动态代理或者CGLIB动态代理技术,为目标Bean执行横向织入
若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理
若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类
3.程序中优先对接口创建代理,便可程序解耦维护
4.标记为final的方法,不能被代理,因为无法进行覆盖
JDK动态代理,是针对接口生成的子类,接口中的方法不能使用final修饰
CGLib是针对目标类生成子类,因此类或者方法不能使用final的
5.Spring只支持方法连接点,不提供属性连接点。可以指定拦截目标类的那些方法
Spring AOP切面类型:
Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截
PointCutAdvisor:代表具有切点的切面,
IntroductionAdvisor:代表引介切面,针对引介通知而使用的切面(不要求掌握)
Spring切面配置参数:
proxyTargetClass:是否对类代理而不是接口,设置为true时,使用CGLB代理
interceptorNames:需要织入目标的Advice
singleton:返回代理是否是单实例,默认单例
optimize:当设置为true时,强制使用CGlib
常用PointcutAdvisor实现类
DefaultPointcutAdvisor最常用的切面类型,它可以通过任意PointCut和Advice组合定义切面
jdkRegexpMethodPointCut构造正则表达式切点
自动创建代理
BeanNameAutoProxyCreator 根据Bean名称创建代理
DefaultAdvisorAutoProxyCreator 根据Advisor本身包含的信息创建代理
AnnotationAwareAspectJAutoProxyCreateor 基于Bean中的AspectJ注解进行自动代理
RestFul
核心内容:
1.资源与URL
2.资源的表述
3.状态的转移
特点:
1.统一了客户端访问资源的接口
2.url更加简洁,易于理解,便于扩展
3.有利于不同系统资源共享
四种形式:
1.GET获取资源
2.POST新建资源
3.PUT修改资源
4.DELETE删除资源
事务
概念:一个程序执行单元执行的一列操作,要么完全执行,要么完全不执行
特性:1.原子性:一个事务是一个不可分割单位
2.一致性:事务必须是使数据库从一个一致性到另一个一致性状态
3.隔离性:一个事务的执行不能被其他事务干扰
4.持久性:事务一旦提交,改变就是永久性的
Mysql事务处理
Mysql中只有使用了Innodb数据库引擎的数据库或表才能支持事务
show engiens --查看服务器支持的引擎
默认以自动提交模式运行
事务并发问题
1.脏读:读取了没有永久性的数据
2.不可重复读:修改操作造成的影响,行锁解决
3.幻读:插入操作造成的影响,表锁解决
事务隔离级别:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
读已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
语句:
select @@tx_isolation 查询默认隔离级别
set session transaction isolation level XXX 设置当前会话隔离级别
TransationDefinition接口
1.隔离级别
2.默认超时 TIMEOUT——DEFAULT
3.事务传播行为
Spring编程式事务处理
基于底层API的编程式事务管理
PlatformTransactionManager
TransactionDefinition
TranscationStatus
基于TransactionTemplate的编程式事务管理
TransactionTemplate
Spring声明式事务处理
概述:Spring的声明式事务处理是建立在AOP上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者声明一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务
建议开发中使用,因为代码干净,维护方便
方式:
1.基于TransactionInterceptor的声明式事务处理
2.基于TransactionProxyFactoryBean声明式事务处理
3.基于
4.基于@Transactional的声明式事务管理
SpringAspect
概念:是一个基于Java语言AOP框架
Spring2.0以后增加了对AspectJ切点表达式的支持
@AspectJ是Aspect1.5新增功能,通过JDK1.5注解技术,允许在Bean类中定义切面