Spring核心概念
IoC(Inversion of Control) 控制反转,将对象的创建控制权转移到外部,由IOC容器来进行提供。
IoC容器:负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean。
DI(Dependence Injection)依赖注入,在容器中建立Bean与Bean之间的依赖关系。
目标:充分解耦
使用IoC容器管理Bean(IoC)
在IoC容器中将有依赖关系的bean进行绑定(DI)
IOC容器
1.导入spring坐标
在pom.xml文件中导入依赖,并且要定义spring要管理的类
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
2.创建一个spring配置文件,配置对应类作为spring管理的bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 2、配置bean,配置的是实现类
id:表示给bean起名字
class:表示给bean定义类型-->
<bean id="bookDao" class="dao.impl.BookDaoImpl"/>
<bean id="bookService" class="service.impl.BookServiceImpl"/>
</beans>
3.初始化IOC容器,通过容器获取bean
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
DI
4.删除业务层中使用new方法创建的dao对象
5.提供对应的set方法
6.在配置文件中配置关系
<bean id="bookService" class="service.impl.BookServiceImpl">
<!-- 配置service与dao的关系
property标签表示配置当前bean的属性
name属性表示配置哪一个具体属性
ref属性表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"/>
</bean>
bean的配置
bean的基础配置
bean的别名配置
bean的作用范围
- IOC容器适合管理单例的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
实例化bean的四种方式
- 使用构造方法
- 使用静态工厂
- 使用实例工厂
- 使用FactoryBean(重点)
bean的生命周期控制
- 在配置中配置初始化和销毁方法
- 实现接口
依赖注入方式
setter注入
- 引用类型
- 简单类型
构造器注入
- 引用类型
- 简单类型
依赖自动装配
集合注入
加载properties文件
容器
创建容器
获取bean
bean相关
依赖注入相关
注解
定义bean
纯注解开发
在加载容器也需要使用纯注解开发形式
bean的作用范围
bean的生命周期
依赖注入
加载properties文件
第三方bean管理
第三方bean依赖注入
XML配置对比注解配置
mybatis使用
- 首先在数据库中创建对应的表
- 创建模块,导入坐标
在maven工程中的pom.xml中添加依赖
<dependencies>
<!-- mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- MySQL的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- Junit的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- 添加日志方面的依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
- 编写mybatis配置文件
创建一个mybatis-config.xml的文件,在其中写入一下信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="qw123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载MySQL映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 编写sql映射文件
创建一个对应类的Mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="selectAll" resultType="com.pojo.User">
select * from tb_user;
</select>
</mapper>
- 编码
//1、加载mybatis的核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、执行sql语句
List<User> list = sqlSession.selectList("test.selectAll");
System.out.println(list);
//4、释放资源
sqlSession.close();
Mapper代理
- 首先需要定义一个与sql映射文件同名的Mapper接口,然后将sql映射文件与对应的Mapper接口放在同一个目录下
- 将sql映射文件中的namesapce改为接口的全路径
- 在Mapper接口中需要创建一个对应的方法,返回值与参数也需要与映射文件中的对应
- 进行编码
//3、获取userMapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
spring整合mybatis
- 将配置文件中的字段整合为一个bean
- 对于映射配置,也将其整合为一个bean
spring整合junit
AOP
面向切面编程,一种编程范式,知道开发者如何组织程序架构
作用:在不惊动原始设计的基础上为其进行功能增强
核心概念:
AOP的简单使用
- 导入相关坐标
- 定义接口与实现类
- 定义通知类
- 定义切入点
- 绑定切入点与通知的关系
- 定义通知类受spring容器管理,并定义当前类为切面类
- 开启spring对AOP注解驱动支持
AOP的工作流程
AOP切入点表达式
- 标准格式
- 使用通配符
*在参数中是必须最少得有一个参数,而…在参数中是可以有也可以没有参数
AOP的通知类型
分为5种类型
- 前置通知
- 后置通知
- 环绕通知(重点)
- 返回后通知
- 抛出异常后通知
在环绕通知中可以通过参数pjp获取方法中的信息
//获取执行签名信息
Signature signature = pjp.getSignature();
//通过签名获取执行类型(接口名)
String typeName = signature.getDeclaringTypeName();
//通过签名获取操作名称(方法名)
String name = signature.getName();
AOP通知获取数据
- 获取方法的调用参数
- 获取方法的返回值
- 获取方法抛出的异常信息
Spring事务
- 在业务层接口上添加Spring事务管理
- 设置事务管理器
- 开启注解式事务驱动
事务的相关配置
事务的传播行为
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法