Spring学习
Spring概述
介绍:Spring框架是企业使用最多的框架,没有之一。Spring是一站式框架,称之为一站式框架的原因是Spring可以整合其他框架。
学习目标:
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的时候系统中对象之间联系过于紧密和复杂牵一发动全身
类之间关系过于复杂
使用IOC之后 可以理解为在这一堆对象中添加一个控制工具把对象之间的耦合度降低
通过中间的IOC容器协调各个对象之间的关系。我们可以看到如果把IOC容器拿掉对象之间的耦合度几乎为0
这样的话开发不同部分的人也无需因为其他人的开发情况影响到自己的进度。
在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
即:面向切面编程。
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用代理的技术,在不修改原来代码的基础上,对已有方法进行增强。
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..*.*(..)
全通配方式:
* *..*.*(..)