java后段必备技术栈
Spring 框架概述
- 轻量级开源 JavaEE 框架,为了解决企业复杂性,两个核心组成: IOC 和 AOP
- 整体架构如下
IOC 容器
what
- 控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
- 使用 IOC 目的:为了耦合度降低
ioc原理
xml 解析、工厂模式、反射
ioc接口
- BeanFactory: IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
- 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
- ApplicationContext:
BeanFactory 接口的子接口
,提供更多更强大的功能,一般由开发人员进行使用- 加载配置文件时候就会把在配置文件对象进行创建
Bean 管理
基于 xml
创建对象
1
<bean id="user" class="com.zipee.spring5.User"></bean>
注入属性
- DI:依赖注入,就是注入属性
- 手动注入(xml中指定)
自动注入
(自动装配)
- DI:依赖注入,就是注入属性
基于注解
创建对象
- 注解类型(以下四个注解功能是一样的,都可以用来创建 bean 实例)
- @Component
- @Service
- @Controller
- @Repository
- @Component
引入依赖(spring-aop jar包)
开启组件扫描
- 如果扫描多个包,多个包使用逗号隔开
扫描包上层目录
1
<context:component-scan base-package="com.zipee"></context:component-scan>
创建类,在类上面添加创建对象注解
- 开启组件扫描细节配置(可以指定扫描过滤器)
- 注解类型(以下四个注解功能是一样的,都可以用来创建 bean 实例)
注入属性
- @Autowired
- 根据属性类型进行自动装配
- @Qualifier
- 根据名称进行注入(需要和@Autowired 一起使用)
- @Resource(javax中定义,建议使用Autowired和Qualifier)
- 可以根据类型注入,可以根据名称注入
- @Value
- 注入普通类型属性
完全注解开发(springboot)
完全注解开发
1
2
3
4//作为配置类,替代 xml 配置文件
"com.zipee"}) (basePackages = {
public class SpringConfig {
}通过配置类获取ioc容器
1
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
- @Autowired
bean分类
普通bean
- 在配置文件中定义 bean 类型就是返回类型
- 工厂bean(FactoryBean)
- 在配置文件定义 bean ==类型可以和返回类型不一样==
- 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
- 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
bean作用域
- 在 Spring 里面,设置创建 bean 实例是单实例还是多实例
- 在 Spring 里面,默认情况下, bean 是单实例对象
- scope 属性值
- singleton
- 加载 spring 配置文件时候就会创建单实例对象
- prototype
- 在调用getBean 方法时候创建多实例对象
- singleton
bean 生命周期
- 通过构造器创建 bean 实例(无参数构造)
- 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
- 调用 bean 的初始化的方法(需要进行配置初始化的方法)
- 把 bean 实例传递 bean 后置处理器的方法 ostProcessAfterInitialization
- bean 可以使用了(对象获取到了)
- 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
- 使用后置处理器
- 创建类,实现接口 BeanPostProcessor,创建后置处理器
- 后置处理器对所有的bean都会生效
Aop
实现原理
- 有接口情况,使用 JDK 动态代理
- 创建接口实现类代理对象,增强类的方法
- 实际使用Proxy动态创建代理对象
- 没有接口情况,使用 CGLIB 动态代理
- 创建子类的代理对象,增强类的方法
术语
连接点
- 类里面可以被增强的方法
切入点
- 实际被真正增强的方法
使用
- 语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )(返回类型一般可省略为空格)
对 com.atguigu.dao.BookDao 类里面的 add 进行增强
1
execution(* com.zipee.dao.BookDao.add(..))
对 com.atguigu.dao.BookDao 类里面的所有的方法进行增强
1
execution(* com.zipee.dao.BookDao.*(..))
对 com.atguigu.dao包里面所有类,类里面所有方法进行增强
1
execution(* com.zipee.dao.*.*(..))
- 通知(增强)
- 实际增强的逻辑
- 通知种类
- 前置通知
- 后置通知
- 环绕通知
- 异常通知
- 最终通知
切面
- 把通知应用到切入点的过程
AspectJ
- AspectJ为独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作
- 使用
- 基于 xml 配置文件实现
- 基于注解方式实现
aop使用步骤
- 创建类,在类里面定义方法
- 创建增强类(编写增强逻辑)
- 在增强类上面添加注解 @Aspect
- 在增强类的里面,在作为通知方法上面添加通知类型注解(@Before,@After…),使用切入点表达式配置
- 进行通知的配置
- 开启注解扫描 @ComponentScan(basePackages = {“com.zipee”})
- 在 spring 配置文件中开启生成代理对象 @EnableAspectJAutoProxy(proxyTargetClass = true)
- 相同的切入点抽取 @Pointcut
- 有多个增强类多同一个方法进行增强,设置增强类优先级 @Order,数字类型值越小优先级越高
事务管理
注解声明式事务管理
在 spring 配置文件配置事务管理器
1
2
3
4
5
6<!--创建事务管理器-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>在 spring 配置文件,开启事务注解
- 在 spring 配置文件引入名称空间 tx
- 开启事务注解
- 在 service 类上面( 或者 service 类里面方法上面)添加事务注解(@Transactional)
- 参数配置说明
- propagation:事务传播行为
- REQUIRED 若已有事物则复用,无则新建
- REQUIRED_NEW 若已有事物则挂起,无则新建
- SUPPORTS
- NOT_SUPPORTED
- MANDATORY
- ioslation:事务隔离级别
- 有三个读问题
- 脏读
- 一个未提交事务读取到另一个未提交事务的数据
- 不可重复读
- 一个未提交事务读取到另一提交事务修改数据
- 虚(幻)读
- 一个未提交事务读取到另一提交事务添加数据
- 脏读
- 有三个读问题
- timeout:超时时间
- 事务需要在一定时间内进行提交,如果不提交进行回滚
- 默认值是 -1 ,设置时间以秒单位进行计算
- readOnly:是否只读
- 读:查询操作,写:添加修改删除操作
- readOnly 默认值 false,表示可以查询,可以添加修改删除操作
- 设置 readOnly 值是 true,设置成 true 之后,只能查询
- rollbackFor:回滚
- 设置出现哪些异常进行事务回滚
- noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
- propagation:事务传播行为
脏读 | 不可重复度 | 幻读 | |
---|---|---|---|
READ UNCOMMITTED (读未提交) | Y | Y | Y |
READ COMMITTED (读已提交) | N | Y | Y |
REPEATABLE READ (可重复度) | N | N | Y |
SERIALIZABLE (串行化) | N | N | N |
XML 声明式事务管理
- 在 spring 配置文件中进行配置
- 配置事务管理器
- 配置通知
- 配置切入点和切面
完全注解声明式事务管理
- 创建配置类,使用配置类替代 xml 配置文件 @Configuration
- 开启组建扫描 @ComponentScan
- 开启事物 @EnableTransactionManagement
- 创建数据库连接池
- 创建 JdbcTemplate 对象
- 创建事务管理器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32//配置类
"com.zipee") //组件扫描 (basePackages =
//开启事务
public class TxConfig {
//创建数据库连接池
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///user_db");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建 JdbcTemplate 对象
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
//到 ioc 容器中根据类型找到 dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入 dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
public DataSourceTransactionManager
getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
Spring5 新功能
支持@Nullable 注解
- @Nullable 注解可以使用在方法上面,属性上面,参数上面,表示方法返回可以为空,属性值可以为空,参数值可以为空
支持函数式风格
- 整合 JUnit5 单元测试框架
- 新增SpringWebflux