[spring]自我理解控制反转(IOC)+面向切面编程(AOP)+JdbcTemplate+事务
Spring
- 框架概述:
- 轻量级开源的JavaEE框架,可以解决企业应用开发的复杂性
- 包含两个核心部分IOC控制反转(把创建对象过程交给spring管理)+AOP(面向切面,不修改源码进行功能增强)
- 特点:
- 方便解耦,简化开发
- Aop编程支持
- 方便程序的测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低API开发难度
1 控制反转IOC
不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
- 谁控制了谁?原来学过的SE程序设计上面,都是直接进行new对象,算是程序主动创建依赖对象,但是IOC是专门一个容器来创建这些对象的,由IOC容器来控制对象的创建.是IOC容器控制了对象
1.原始的方式为:
类1
class UserService{
execte(){
//在方法excute()中调用类2 UserDao的add()方法
//1.实现步骤需要先new UserDao对象
UserDao dao = new UserDao();
dao.add();
}
}
类2
class UserDao{
add(){
...
}
}
- 总结:耦合度太高
2.工厂模式:
类1
class UserService(){
execute(){
//在方法excute()中调用类2 UserDao的add()方法
//1.使用工厂
UserDao dao = UserFactory.getDao();
dao.add();
}
}
类2
class UserDao{
add(){
...
}
}
工厂类
class UserFactory(){
public static UserDao getDao(){
return new UserDao();
}
}
总结+关系图:解除了一部分耦合
eg:
- 我们设计一个男生类和一个女生类(Boy Girl)
- Boy中有kiss(),boy如何认识这个girl类?
- 从小认识 朋友介绍 亲戚介绍 父母包办(自动化创建对象)
- 假如从小就认识,缺点在于无法更换并且要负责整个Girl的生命周期,如果我们想要换一个怎么办呢?
- 需要朋友介绍或者亲戚介绍来(也就是有一个中间人了)让中间人来负责提供girl见面
- 但是亲友的BoyFactory都是单例,不然就是存在于全局变量中,不够灵活,我们只需要让父母包办躺好准备kiss()就ok
- boy 和 girl 都不用瞎忙和了这就是IOC,将对象的创建和获取提取到外部,由外部容器提供组件.
2 AOP
AOP在Java里是利用反射机制实现,也可以认为是动态代理,不过动态代理也是反射机制实现的,那么如何使用AOP呢,如下图那样
我们如果要在一个方法上面加强这个方法的话,就需要使用AOP了
1.底层原理
有接口的情况,使用JDK动态代理
- 创建接口实现类代理对象,增强类的方法
没有接口的情况,使用CGLIB动态代理
- 创建子类的代理对象,增强类的方法
2.术语
- Joint Point :连接点(类的哪些方法可以被增强,这些方法称为连接点)
- Pointcut :切入点(实际被真正增强的方法,称为切入点)
- Advice :通知(实际增强的逻辑部分称为通知)
- 分为多种通知(前置 后置 环绕 异常 最终)通知
- Aspect :切面(是动作,把通知应用到切入点的过程)
3 事务
什么是事务?
是数据库操作的最基本单元,逻辑上一组操作,要么都成功,如果有一个操作失败的话所有操作都失败.
典型的场景为银行转账
事务的四个特性(ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
举例说明
数据库为
分为dao和service
dao的实现类中使用JdbcTemplate操作数据库,addMoney() \ reduceMoney()
service中注入dao的接口,然后操作调用两个方法
test类中测试发现如果没有异常则可以处理完成,但是如果service中reduceMoney()之后出现了异常,则会出来lucy扣了钱,但是marry没有加钱的情况,这种情况下就需要开启事务
只需要maven中引入然后在需要在xml中配置后,在需要开启的方法或者类上面加上@Transactional()