Spring核心详解!!!
Spring出现的原因?
Spring出现的原因 解除耦合
软件开发的开闭原则:通过多态实现,要么子类重写父类,要么增加方法
提高抽象层次;
提高抽象层次的方法
把子类对象赋给父类对象进行使用的动态多态
注入Injection:某一个类想要什属性,通过set方法给他 就叫注入
依赖注入 Depenency Injection =DI 有set就能活 没有就错误
配置文件(反射)
Spring如何解除耦合
解耦合:首先解除逻辑耦合
mvc模式第一次解除了逻辑耦合
spring的IOC是进行深度解耦
日志:用来保持程序的健壮性,就是程序的运行记录
代理需要在jdk1.5以上版本使用
jdk代理是基于反射的没有反射就没有办法通用
调用代理类的的任何方法,都会执行到invoke方法
代理是模式
代理机制其实真正的代理的是方法
代理:proxy
代理的本质就是原产品不动,不做任何改变
要增值
要包装
代理分类:
一.静态代理:门面模式或装饰模式
缺点:需要为每一个被代理的方法都写一个代理方法,修改的时候特别值复杂,不灵活
二.动态代理
1.jdk动态代理:缺点:要想代理对象,被代理对象必须有接口,否侧不能代理
2.CGLIB代理:优点:在被代理类没有接口的情况下也能够被代理,实际就是为当前类生成一个子类
代理类和被代理类都需要实现同一个接口,代理类中包含一个被代理类的对象,可以提供两种方式把被代理对象赋给代理对象
调用被代理类,实现真正的逻辑,在自己的里面实现额外逻辑.
代理最终的要求就是简单通用灵活
Spring核心(重点来了!!!!)
Spring是一个无侵入式的轻量级开源框架
Spring两大特性 :
1.IOC:控制反转
IOC作用:解除类与类之间的关系耦合
解除耦合的方式用了四个技术点:
- 配置
- 容器
- 反射
- 注入(DI):利用set方法或者构造器给属性赋值
2.AOP:面相切面编程
作用:为了解除业务逻辑耦合,例如耦合或者数据业务逻辑日志业务
AOP实现原理是基于代理的
Spring进行内部实现的时候 ,会检测是否存在接口,存在时选择jdk动态代理,不存在选择CGLIB代理
Spring类似一个管家,后期几乎所有内容都交给Spring管理,View层Spring不管理,与java相关的全部管理.(Spring容器)
Spring的核心思想是解除程序中的耦合(解除了业务逻辑耦合,解除了类与类之间的关系耦合)
轻量级与重量级的区分:
1.性能开销
2.框架本身的大小问题
3.使用的难易程度
Spring中所有的行为都是基于Spring能够管理所有的类
Spring也有持久层框架,但是因为性能不强,所以没有人用,用来给hibernate和mybitas支持
Spring对web框架也是有支持的
Spring还是一个mvc结构的框架
Core解除的是类级别的耦合
AOP解除的是方法级别的耦合
IOC控制反转 Inversion Of Control
高层模块不应该依赖底层模块(如Action依赖Dao层)
实现必须依赖抽象,而不是是抽象依赖实现
依赖注入:Dependency Injection
DI是IOC的核心实现原理
通俗的说就是利用set方法或者构造器给属性赋值
搭建Spring环境:
1.加入jar包
2.写配置文件:applicationContext.xml 必须放在Src下 可以更改名字一般叫Spring.xml
一个Spring可以对应多个XMl文件,配置文件的划分是根据业务逻辑划分的
跟标签里写东西是Schema
Spring的核心是一个context容器
想要什么对象就在spring中配置这个对象
Spring会自动创建对象并且进行初始化
注入类型分为三类:
Type1 侵入式(依赖Spring)
Type2 (set/get) 和type3(构造器注入)是非侵入式
Spring中的接口是为了提高抽象层次,是变量接收的一个中介,所以Srping不需要管理接口
所谓的组件就是可以直接实例化,可以直接用的
构造器注入 里面的属性 ref=references引用 index要赋值属性的下标,从0开始
构造器注入唯一的优点就是时效性好,创建对象时直接赋值.
构造器注入作为了解 不需要掌握
构造器和set/get方法同时存在时取决于set/get方法
命名空间的引入和标签的引入差不多,不引用就不能用
当要注入的组件只有一个类型,注解后可以不配置,当有多个同一类型组件时,注解必须手动指定匹配的对象.
使用annotation注入就是为了0配置,resource自动配置属性,这是spring第一次使用0配置
0配置就是使用annotation的方式替代xml中配置的方式都叫0配置
使用Aop是最终使用annotation方式
Aspect Oriented Programming面向切面编程
切面就是系统服务逻辑
AOP的实现种类
1.实现Spring API的传统模式 侵入式实现已经淘汰(spring提倡无侵入式编程)
2.基于xml的设置
3.基于annotation配置
如上:
只要想写切点,必然要写 pointcut="execytion( * 包名+类名. * (…))"第一个 * 指任意返回值类型 第二个 * 表示所有方法 …表示任意参数
AOP基于代理的
最最最最常见的注解
事务是什么??
事物Transaction: 就是一件完整的事情:由一条或者多条sql语句组成,要么全部执行成功,要么全部执行失败.
例如(增删改,或者查询时加了for update 为了加上锁定事物,意思就是我操作完成后,别人才能操作当前对象)
事物的特点:1.最小单元—原子性(不可再分割)
例如:必须有两条sql语句才能完成一次删除部门的操作;
2.一致性
例如:数据改变之前的状态和改变之后的状态一致;
3.持久性
例如:数据修改完毕后应该是一个持久状态存在数据库中,而不是临时的;
4.隔离性(当一个事物占用某一个资源的时候,其余的事物只能进行等待,等待释放对于资源的占用)