Spring框架概述
Spring是什么:
它是一个容器,是整合其他框架的框架,它的核心是IOC和AOP,它由20多个模块构成,在很多领域都提供优秀的解决方案。是可以在javaSE/EE中使用的轻量级框架。
Spring的特点
1、轻量级
由20多个模块构成,每个jar包都很小,小于1M,核心包在3M左右。对代码无污染。
2、面向接口编程
使用接口,就是面向灵活,项目的可扩展性、可维护性都极大的提高了。因为:接口不关系实现类的类型,使用时接口指向实现类,切换实现类即可切换整个功能。
3、AOP:面向切面编程
就是将公共的,通用的,重复的代码单独开发,在需要的时候反织回去,底层的原理是动态代理。
4、整合其他框架
它整合后使其他框架更易用。
什么是IOC
控制反转IOC是一个概念,一种思想,由Spring容器进行对象的创建和依赖注入,程序员在使用时直接取出使用。
正转:由程序员进行对象的创建和依赖注入称为正转,程序员说了算。
即程序员创建对象,程序员进行赋值。
反转:由Spring容器创建对象和依赖注入称为反转,将控制权从程序员手中夺走,交由Spring容器,称为反转。
Spring容器负责对象的创建。
正转程序员说了算,反转容器说了算。
配置pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springStudy01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加Spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
基于xml的IOC
1、创建对象
2、给创建的对象赋值。
A。使用setter注入
注入分为简单类型注入和引用类型注入。
简单类型注入值使用value属性。
引用类型注入值使用ref属性。
必须要注意:使用setter注入必须提供无参的构造方法,必须提供setXXX()方法
B。使用构造方法注入
Student stu =new Student();
a.使用构造方法的参数名称进行注入值。
<bean id="school" class="com.study.pojo3.School">
<constructor-arg name="name" value="电子科技大学"></constructor-arg>
<constructor-arg name="address" value="cd"></constructor-arg>
</bean>
b.使用构造方法的参数下标注入值。
<!--创建学生的对象,使用构造方法的参数下标注入值-->
<bean id="stu" class="com.study.pojo3.Student">
<constructor-arg index="0" value="小一"></constructor-arg>
<constructor-arg index="1" value="33"></constructor-arg>
<constructor-arg index="2" ref="school"></constructor-arg>
</bean>
c.使用默认的构造方法的参数的顺序注入值。
<!--创建学生的对象,使用默认的构造方法的参数顺序-->
<bean id="stuSquence" class="com.study.pojo3.Student">
<constructor-arg value="小二"></constructor-arg>
<constructor-arg value="56"></constructor-arg>
<constructor-arg ref="school"></constructor-arg>
</bean>
项目案例
使用三层架构进行用户的插入操作。
界面层,业务逻辑层,数据访问层。
Spring会接管三层架构中哪些对象的创建?
非Spring接管下的三层项目构建:
实体类
数据访问层(接口。实现)
业务逻辑层(接口。实现)
页面层
基于注解的IoC
也成为DI,它是IOC的具体实现的技术。
用注解来进行创建对象并依赖注入。
1、创建对象的注解
@Component:可以创建任意对象。
@Controller:专门用来创建控制器的对象,这种对象可以接受用户的请求,可以返回处理结果的客户端。
@Service:专门用来创建业务逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层。
@Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查所有操作。
2、依赖注入的注解
值类型注入:
@Value:专门用来给简单类型注入值。
引用类型注入:
A。@Autowired:使用类型注入值,从整个bean工厂中搜索同源类型的对象进行注入。
B。@Autowired
@Qualifier:使用名称注入值,从整个bean工程中搜索相同名称的对象进行注入。
面向切面编程
什么是切面:公共的,通用的,重复的功能称为切面,面向切面编程就是将切面提取出来,单独开发,在需要调用的方法中通过动态代理的方式进行织入。
手写AOP框架
业务:图书购买业务。
切面:事务
1、第一个版本,业务和切面紧耦合在一起,没有拆分。
2、第二个版本,使用子类代理的方式拆分业务和切面。
3、第三个版本,使用静态代理,拆分业务和切面,此时切面紧耦合在业务中。
4、第四个版本,使用静态代理,拆分业务和业务接口,切面和切面接口。
5、第五个版本,使用动态代理完成第四个版本的优化。
Spring支持的AOP实现
Before、After、Throws、Around
AOP常用术语:
1、切面:就是那些重复的,公共的,通用的功能称为切面,例如:日志,事务,权限
2、连接点,就是目标方法,因为在目标方法中要实现目标方法的功能和切面功能。
3、切入点(Pointcut):多个连接点构成切入点,切入点可以是一个目标方法,可以是一个类中的所有方法,可以是某个包下的所有类中的方法。
4、目标对象:操作谁,谁就是目标对象
5、通知:来指定切入的时机,是在目标方法执行前还是执行后还是出错时,还是环绕目标方法切入切面功能。
AspectJ框架
是一个优秀的面向切面的框架,它扩展了java语言,提供了强大的切面实现。它因为是基于java语言开发的,所以无缝扩展。
易学易用。
AspectJ常见通知类型:
前置通知Before、后置通知AfterReturning,最终通知After、环绕通知Around、定义切入点@Pointcut
AspectJ的切入点表达式:
规范的公式:
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
简化后的公式:
execution(方法返回值 方法声明(参数))
用到的符号:
*代表任意个任意的字符(通配符)
… 如果出现在方法的参数中,则代表任意参数
如果出现在路径中,则代表本路径及其所有子路径
<!--添加AspectJ依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspectj</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
AspectJ的前置通知@Before
在目标方法执行前切入切面功能,在切面方法中不可以获得目标方法的返回值,只能得到目标方法的签名。
实现的步骤:
1、创建业务接口
2、创建业务实现
3、创建切面类
4、在applicationContext.xml文件中进行切面绑定
SM框架整合的步骤
1、建表
2、新建项目
3、修改目录
4、修改pom.xml文件,添加相关的依赖
5、添加mybatis模板
6、添加SqlMapConfig.xml文件
7、添加applicationContext_mapper.xml
8、添加applicationContext_service.xml
9、添加Users实体类,Account实体类
10、添加mapper包,添加UsersMapper接口和UsersMapper.xml文件并开发。
11、添加service包,添加UsersService接口和UsersServiceImpl实现类。
12、添加测试类进行功能测试
Spring的两种事务处理方式
1、注解式的事务
使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,此注解可添加到方法上,只是此方法执行事务的处理。
2、声明式事务:在配置文件中添加一次,整个项目都遵循事务的设定。
Spring事务的五大隔离级别:
1、DEFAULT:采用 DB 默认的事务隔离级别
2、READ_UNCOMMITTED:未提交读
3、READ_COMMITTED:已提交读
4、REPEATABLE_READ:可重复读
5、SERIALIZABLE:串行读
Mysql默认的事务隔离级别是可重复读。
Oracle默认系统事务隔离级别是已提交读。
为什么添加事务管理器
JDBC:Connection con.commit() ; con.rollback();
MyBatis:SqlSession sqlSession.commit();sqlSession.rollback();
Hibernate:Session session.commit();session.rollback();
事务管理器用来生成相应技术的连接+执行语句的对象。
如果用mybatis框架,必须使用DataSourceTracsactionManager类完成处理。
事务的传播特性:
多个事务之间的合作,互斥等都可以通过设置事务的传播特性来解决。
事务的传播特性有七种:
-
PROPERGATION_MANDATORY 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常
-
PROPAGATION_NESTED 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样
-
PROPAGATION_NEVER 表示方法不能运行在一个事务中,否则抛出异常
-
PROPAGATION_NOT_SUPPORTED 表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起
-
PROPAGATION_REQUIRED(增删改必用) 表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务
-
PROPAGATION_REQUIRES_NEW 表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起
-
PROPAGATION_SUPPORTS 表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中