第一部分:课程总结串讲
任务一
一 Spring概述
spring是一款 full-stack 轻量级开源框架
因为可以整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架
IOC
控制反转
AOP
面向切面编程
优势
方便解耦,简化开发
AOP编程的支持
声明式事务的支持
方便程序的测试
方便集成各种优秀框架
降低JavaEE API的使用难度
Java源码经典学习范例
二 初识IOC
控制反转(Inverse Of Control)是一种设计思想。它的目的是指导我们设计出更加松耦合的程序。
控制:在java中指的是对象的控制权限(创建、销毁)
反转:指的是对象控制权由原来 由开发者在类中手动控制 反转到 由Spring容器控制
自定义IOC容器
配置文件 + BeanFactory
解耦合的原则是编译期不依赖,而运行期依赖就行了。
三 Spring快速入门
实现步骤
1. 创建java项目,导入spring开发基本坐标
2. 编写Dao接口和实现类
3. 创建spring核心配置文件
4. 在spring配置文件中配置 UserDaoImpl
5. 使用spring相关API获得Bean实例
四 Spring相关API
BeanFactory
是 IOC 容器的核心接口,它定义了IOC的基本功能。
特点:在第一次调用getBean()方法时,创建指定对象的实例
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(“applicationContext.xml”));
ApplicationContext
代表应用上下文对象,可以获得spring中IOC容器的Bean对象。
特点:在spring容器启动时,加载并创建所有对象的实例
常用实现类
1. ClassPathXmlApplicationContext: 它是从类的根路径下加载配置文件 推荐使用这种。
2. FileSystemXmlApplicationContext : 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3. AnnotationConfigApplicationContext: 当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
常用方法
1. Object getBean(String name);
根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。
2. T getBean(Class requiredType);
根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错。
3. T getBean(String name,Class requiredType);
根据Bean的id和类型获得Bean实例,解决容器中相同类型Bean有多个情况。
五 Spring配置文件
5.1 Bean标签基本配置
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名
5.2 Bean标签范围配置
scope
singleton
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
prototype
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
5.3 Bean生命周期配置
init-method 指定类中的初始化方法名称
destroy-method 指定类中销毁方法名称
5.4 Bean实例化三种方式
无参构造方法
工厂静态方法 (针对于Jar包中的类)
工厂实例方法
5.5 Bean依赖注入概述
通过框架把持久层对象传入业务层,而不用我们自己去获取。
依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
5.6 Bean依赖注入方式
构造方法
set方法
p命名空间
5.7 Bean依赖注入的数据类型
简单数据类型
引用数据类型
集合数据类型
list
set
array
map
properties
5.8 配置文件模块化
主从配置
拆分方式:
按层进行拆分
按模块拆分
六 DbUtils(IOC实战)
介绍
DbUtils是Apache一款用于简化jdbc操作的工具类
核心对象
QueryRunner queryRunner = new QueryRunner(DataSource dataSource);
核心方法
int update();
DML类型
T query();
DQL类型
Spring的xml整合DbUtils
spring整合第三方数据源
Druid
spring整合DbUtils
QueryRunner
加载第三方配置文件
七 Spring注解开发
常用注解
IOC
@Component
@Controller
@Service
@Repository
DI
@Autowired
根据类型
@Qualifier
在@Autowired基础上+id
@Resource
@Autowired + @Qualifier
@Value
通过SPEL表达式,获取第三方配置文件的值
生命周期
@Scope
作用范围
singleton
prototype
@PostConstruct
初始化执行方法
@PreDestroy
销毁执行方法
新注解
@Configuration
spring的配置文件
applicationContext.xml
@Bean
将第三方类,交给ioc容器
@PropertySource
加载第三方配置文件
@ComponentScan
开启注解组件扫描
@Import
配置类模块化
八 Spring整合Junit
@Runwith注解替换原来的运行器
@RunWith(SpringRunner.class)
通过该运行期 加载核心配置文件
使用@ContextConfiguration指定配置文件或配置类
@ContextConfiguration(value = {“classpath:applicationContext.xml”})
@ContextConfiguration(classes = {SpringConfig.class})
任务二
一 转账案例基础
基础功能
转出
转入
传统事务控制
ConnectionUtils
ThreadLocal
线程局部变量,存储空间(Thread.ThreadLocalMap)
TransactionManager
事务管理器
问题:
核心业务 和 通用业务 产生了代码入侵
二 转账案例进阶
代理事务控制
JDK: 面向接口的代理方式: 要求被代理类至少实现一个接口
CGLIB: 面向父类的代理方式,要求被代理的类,不能被final修饰
三 SpringAOP简介
AOP:面向切面编程
在不修改源代码情况下,实现对方法的增强
spring的AOP
简化了增强部分的配置,使开发者只关注业务本身
AOP底层实现
动态代理
在 Spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
AOP相关概念
Target
目标对象: 要被代理的对象
Joinpoint
连接点: 可以被增强的方法
Pointcut
切点: 真正被增强的方法
Advice
通知: 包含了增强业务逻辑的方法
Weaving
织入: 切点和通知结合,产生代理对象的过程
Aspect
切面: 通知和切入点的结合
Proxy
代理对象
四 基于XML的AOP开发
aop织入的配置
aop:config
<aop:before method=“通知方法名称” pointcut=“切点表达式”>
切点表达式
通知的类型
aop:before
前置通知
aop:after-returning
后置通知
aop:after-throwing
异常通知
aop:after
最终通知
aop:around
环绕通知
五 基于注解的AOP开发
切面类
@Aspect
public class MyAdvice {}
切点表达式
@Pointcut(“execution(void com.lagou.service.. .(..))”)
public void myPoint(){}
通知类型
@Before
@AfterReturning
@AfterThrowing
@After
@Around
AOP自动代理
aop:aspectj-autoproxy/
@EnableAspectJAutoProx
六 AOP优化转账案例
xml配置实现
注解配置实现
任务三
一 Spring的JdbcTemplate
介绍
JdbcTemplate是Spring的一款用于简化Dao代码的工具,它底层封装了JDBC技术
核心对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSource dataSource);
核心方法
DML
int update();
DQL
List query();
T queryForObject();
查询ORM映射处理实现类
BeanPropertyRowMapper<>(Class 字节码对象)
Spring整合JdbcTemplate
实现转账案例
我们发现了无法使用自己定义的事务管理器(LOW)、需要引出spring内置事务管理器
二 Spring的事务
编程式事务控制(了解)
开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。
相关对象
PlatformTransactionManager:是spring的事务管理器,里面提供了我们常用的操作事务的方法。
DataSourceTransactionManager
TransactionDefinition: 事务的定义对象
隔离级别
ISOLATION_READ_UNCOMMITTED 读未提交
ISOLATION_READ_COMMITTED 读已提交
ISOLATION_REPEATABLE_READ 可重复读
ISOLATION_SERIALIZABLE 串行化
传播行为
REQUIRED
一个service调用另一个service方法时,必须要有事务
增删改
SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
查询
声明式事务控制(掌握)
在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。底层采用AOP思想来实现的。
声明式事务控制明确事项:
- 核心业务代码(目标对象)
- 事务增强代码(Spring已提供事务管理器)
切面配置
基于XML方式的声明式事务控制
* 平台事务管理器配置事务通知的配置
- 事务aop织入的配置
基于注解方式的声明式事务控制
* 平台事务管理器配置(xml、注解方式) - 事务通知的配置(@Transactional注解配置)
- 事务注解驱动的配置 tx:annotation-driven/、@EnableTransactionManagement
三 Spring集成web环境
ApplicationContext应用上下文获取方式
Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象
具体配置
1. 在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)
- 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext