框架Spring学习笔记(IOC,AOP)

Spring学习

Spring概述

介绍:Spring框架是企业使用最多的框架,没有之一。Spring是一站式框架,称之为一站式框架的原因是Spring可以整合其他框架。
框架Spring学习笔记(IOC,AOP)
学习目标:

Spring IoC:对象工厂及依赖注入;
Spring AOP:面向切面编程技术,为Spring事务管理打下基础。
Spring Transaction management:Spring事务管理。
Spring Web MVC(不包含在本课程内,后面单独学习):简称Spring MVC框架,用来简化 JavaWEB开发,当使用Spring MVC框架后,就不用再编写Servlet了。也就不再需要itcast-tools工具中BaseServlet类了。
Spring与其他框架整合:因为我们只学习过MyBatis框架,所以当前我们只学习Spring整合MyBatis框架。

IOC学习

1.1什么是IOC

IoC 是 Inversion of Control 的缩写,翻译为控制反转。作用是解决对象之间的耦合度过高的问题,从而降低程序的复杂度
不使用IOC的时候系统中对象之间联系过于紧密和复杂牵一发动全身
框架Spring学习笔记(IOC,AOP)
类之间关系过于复杂
框架Spring学习笔记(IOC,AOP)
使用IOC之后 可以理解为在这一堆对象中添加一个控制工具把对象之间的耦合度降低
框架Spring学习笔记(IOC,AOP)
通过中间的IOC容器协调各个对象之间的关系。我们可以看到如果把IOC容器拿掉对象之间的耦合度几乎为0
框架Spring学习笔记(IOC,AOP)
这样的话开发不同部分的人也无需因为其他人的开发情况影响到自己的进度。

在A对象使用B对象的过程中,如果不用IOC 则A要主动创建B对象才能使用。 如果使用IOC则只需要A在书写时声明要用到B对象。 IOC会择机创建B对象用A使用。 这种创建对象的方式就可以理解为创建对象的控制权从原来的A主动创建,到A被动接受。形成了“控制反转”

Spring IoC的核心如下:

1.工厂负责对象生命周期的管理;(spring管理创建与销毁)
2.对象的依赖由工厂完成注入。(spring维护对象间关系)
3.Spring提出了对象工厂的概念,由Spring工厂来管理对象的生命周期。所谓对象生命周期指的是从对象的创建一直到对象的销毁都由Spring来管理。我们无需再自己new对象,而是从Spring工厂中获取需要的对象。甚至对象的依赖也由工厂来注入,无需手动注入依赖。
4.Spring工厂是ApplicationContext接口,通常我们使用的是AnnotationConfigApplicationContext类。其中Spring工厂内部是通过Map类型来维护的。

1.2IOC详解

注解 描述
@Component 将修饰的资源交予spring管理。value属性:为资源命名(唯一标识)
@Controller 衍生注解,与@Component作用和属性相同。特用于修饰表示层的资源。
@Service 衍生注解,与@Component作用和属性相同。特用于修饰业务逻辑层的资源。
@Repository 衍生注解,与@Component作用和属性相同。特用于修饰数据访问层的资源。
注解 描述 修饰位置
@Resource(name=”…”) 按照指定名称注入对象 字段、setter方法
@ Resource 按照类型注入对象 字段、setter方法
@Value 注入简单值 字段、setter方法、参数
@PropertySource 加载properties配置文件

AOP学习

1.1什么是AOP

AOP:全称是Aspect Oriented Programming即:面向切面编程
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用代理的技术,在不修改原来代码的基础上,对已有方法进行增强。
框架Spring学习笔记(IOC,AOP)

1.2AOP作用和优势

作用:
	1.	在程序运行期间,不修改源码对已有方法进行增强。
优势:
	1.减少重复代码
	2.提高开发效率
	3.维护方便

1.3AOP相关术语

Target(目标对象):
	代理的目标对象。
	例如:UserServiceImpl
Joinpoint(连接点):
	程序的某个特定位置,比如类开始初始化前,初始化后,方法调用前后,抛出异常前后等。
	例如:eat方法调用前后 
Pointcut(切入点):
	基于连接点,链接点描述的可以增强的点,如果真的在这个点增强了,那这个点就叫做切入点。
	例如:eat方法调用之前如果进行了增强,那这个点就叫做切入点
Advice(通知/增强):
	需要添加的那段增强功能的逻辑代码,
	通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
	例如:要在eat之前添加 wash,之后添加clean ,那wash和clean就是增强
Aspect(切面):
	是切入点和通知的结合。
	例如:MyAspect类
Proxy(代理):
	一个类被AOP织入增强后,就产生一个结果代理类。
织入:
	增强添加到目标类的具体链接点上的过程。

1.4相关注解

注解 描述
@Aspect 把当前类声明成切面类
@Before 把当前方法看成是前置通知
@AfterReturning 把当前方法看成是后置通知。
@AfterThrowing 把当前方法看成是异常通知
@After 把当前方法看成是最终通知
@Around 把当前方法看成是环绕通知
@Pointcut 指定切入点表达式

1.5切入点表达式

execution:
	匹配方法的执行(常用)		
	execution(表达式)
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
写法说明:
全匹配方式:
	public void com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
访问修饰符可以省略	
	void com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
返回值可以使用*号,表示任意返回值
	* com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
包名可以使用*号,表示任意包,但是有几级包,需要写几个*
	* *.*.*.*.CustomerServiceImpl.saveCustomer()
使用..来表示当前包,及其子包
	* com..CustomerServiceImpl.saveCustomer()
类名可以使用*号,表示任意类
	* com..*.saveCustomer()
方法名可以使用*号,表示任意方法
	* com..*.*()
参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数
	* com..*.*(*)
参数列表可以使用..表示有无参数均可,有参数可以是任意类型
	* com..*.*(..)
全通配方式:
	* *..*.*(..)
上一篇:什么是IOC?教你手撸一个IOC容器


下一篇:散列冲突(哈希碰撞)的解决办法