[spring]自我理解控制反转(IOC)+面向切面编程(AOP)+JdbcTemplate+事务

Spring

  1. 框架概述:
    1. 轻量级开源的JavaEE框架,可以解决企业应用开发的复杂性
    2. 包含两个核心部分IOC控制反转(把创建对象过程交给spring管理)+AOP(面向切面,不修改源码进行功能增强)
  2. 特点:
    1. 方便解耦,简化开发
    2. Aop编程支持
    3. 方便程序的测试
    4. 方便和其他框架进行整合
    5. 方便进行事务操作
    6. 降低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();
	}
}

总结+关系图:解除了一部分耦合

image

eg:

  1. 我们设计一个男生类和一个女生类(Boy Girl)
  2. Boy中有kiss(),boy如何认识这个girl类?
  3. 从小认识 朋友介绍 亲戚介绍 父母包办(自动化创建对象)
  4. 假如从小就认识,缺点在于无法更换并且要负责整个Girl的生命周期,如果我们想要换一个怎么办呢?
  5. 需要朋友介绍或者亲戚介绍来(也就是有一个中间人了)让中间人来负责提供girl见面
  6. 但是亲友的BoyFactory都是单例,不然就是存在于全局变量中,不够灵活,我们只需要让父母包办躺好准备kiss()就ok
  7. boy 和 girl 都不用瞎忙和了这就是IOC,将对象的创建和获取提取到外部,由外部容器提供组件.

2 AOP

AOP在Java里是利用反射机制实现,也可以认为是动态代理,不过动态代理也是反射机制实现的,那么如何使用AOP呢,如下图那样
image
我们如果要在一个方法上面加强这个方法的话,就需要使用AOP了

1.底层原理

有接口的情况,使用JDK动态代理

  1. 创建接口实现类代理对象,增强类的方法
    image

没有接口的情况,使用CGLIB动态代理

  1. 创建子类的代理对象,增强类的方法
    image

2.术语

  • Joint Point :连接点(类的哪些方法可以被增强,这些方法称为连接点)
  • Pointcut :切入点(实际被真正增强的方法,称为切入点)
  • Advice :通知(实际增强的逻辑部分称为通知)
    1. 分为多种通知(前置 后置 环绕 异常 最终)通知
  • Aspect :切面(是动作,把通知应用到切入点的过程)

3 事务

什么是事务?
是数据库操作的最基本单元,逻辑上一组操作,要么都成功,如果有一个操作失败的话所有操作都失败.

典型的场景为银行转账

事务的四个特性(ACID)

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

举例说明

数据库为
image
分为dao和service
dao的实现类中使用JdbcTemplate操作数据库,addMoney() \ reduceMoney()
service中注入dao的接口,然后操作调用两个方法
test类中测试发现如果没有异常则可以处理完成,但是如果service中reduceMoney()之后出现了异常,则会出来lucy扣了钱,但是marry没有加钱的情况,这种情况下就需要开启事务

只需要maven中引入然后在需要在xml中配置后,在需要开启的方法或者类上面加上@Transactional()

posted @ 2022-03-16 21:21  1_f  阅读(64)  评论(0)    收藏  举报