Spring基础
一.Spring Ioc容器管理
第一章:Spring初识
1.IoC控制反转
2.介绍Spring
3.分析传统编码方式的不足
第二章:使用XML方式实现Spring Ioc
第三章:Bean对象的作用域及生命周期
1.bean scope属性讲解
第四章:使用注解方式实现Spring Ioc
1.四种组件类型注解
基于注解配置IoC容器:
- 摆脱繁琐的XML形式的bean与依赖注入配置
- 基于"声明式"的原则,更适合轻量级的现代企业应用
- 让代码可读性变得更好,研发人员拥有更好的开发体验。
三类注解:
组件类型注解:声明当前类的功能与职责。
自动装配注解:根据属性特征自动注入对象。
元数据注解:更细化的辅助IoC容器管理对象的注解。
四种组件类型注解:
- @Component :组件注解,通用注解,被该注解描述的类将被IoC容器管理并实例化(下面三个注解都是组件注解的细化,不确定类的职责时使用@Component 就可以了,四种注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层使用不同的注解标记;)
- @Controller:语义注解,说明当前类是MVC应用中的控制器类
- @Service :语义注解,说明当前类是Service业务服务类
- @Repository :语义注解,说明当前类用于业务持久层,通常描述对应Dao类(业务持久层:负责与数据库进行增删改查的类,采用DAO模式,建立实体类和数据库表映射。持久层的目的就是,完成对象数据和关系数据的转换。)
开启组件扫描:
作用:IoC容器初始化时自动扫描四种组件类型注解并实例化
<context:component-scan base-package="包名"> </context:component-scan>
组件注解配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
这与之前通过xml进行配置的xml区别在于:增加了 xmlns:context="http://www.springframework.org/schema/context 命名空间(命名空间:类似于Java中的包名),通过**context:**前缀标签后可以发现命名空间的字标签。
**注意:**组件类型注解默认beanId为类名首字母小写也可以自定义(例如UserDao类,@Repository默认bean的Id为userDao),也可以自己定义@Repository(“value = “userDao””);
2.自动装配与Autowired注解
两类自动装配注解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcxRRo1Y-1646925619200)(C:\贺航\Typroa图片\Spring\1646829863546.png)]
第五章:使用Java config方式实现Spring Ioc
二.Spring AOP面向切面编程
三.Spring JDBC与事务管理
第一章:Spring JDBC
1.介绍Spring JDBC
主要内容:
- Spring JDBC是与JdbcTemplate对象
- 声明式事务与两种配置方式
- 声明式事务七种事务传播行为
Spring JDBC:
-
Spring JDBC是Spring框架用于处理关系型数据库的模块。
-
Spring JDBC对JDBC API进行封装,极大简化开发工作量。
-
jdbcTemplate是Spring JDBC核心类,提供数据CRUD方法。
有了 MyBatis 为什么还需要 Spring JDBC?
Mybatis作为一个ORM框架,封装程度高,适合中小企业进行软件的敏捷开发,让程序员快速完成与数据库的交互工作。但因为封装程度高,所以其执行效率较低Spring JDBC则只是对原始JDBC API进行了简单封装,执行效率高于Mybatis。一些大厂喜欢利用Spring JDBC简单封装的特点,并结合自身需求进行二次封装。
Spring JDBC的使用步骤:
- Maven工程引入依赖spring-jdbc
- applicationContext.xml配置DataSource数据源
- 在Dao注入JdbcTemplate对象,实现数据CRUD(Ccreate 添加数据read读取数据 update 修改数据delete删除数据)
2.Spring JDBC配置过程
开发步骤:
-
引入Spring 和 SpringJDBC、MySQLJDBC驱动的相关依赖
<!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- spring-jdbc (版本号和spring框架号保持一致)--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- 阿里数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
-
创建applicationContext.xml配置文件,引入xml文件标志和Schema
导入属性文件
<context:property-placeholder location="config.properties"/>
属性文件(config.properties)
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/web_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username=root password=root
-
管理数据源对象
spring 管理与数据库链接 (数据源)
<!--配置阿里巴巴数据源管理的类,交给spring统一管理--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="${url}"></property> <property name="driverClassName" value="${driverClassName}"></property> <property name="username" value="${uname}"></property> <property name="password" value="${password}"></property> <property name="initialSize" value="5"></property> <property name="maxActive" value="20"></property> <property name="maxWait" value="100"></property> </bean>
-
在配置文件中创建 JdbcTemplate
<!--配置spring中对jdbc进行的封装的JdbcTemplate--> <!--JdbcTemplate提供数据CRUD的API--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入了数据源--> <property name="dataSource" ref="dataSource"></property> </bean>
3.JdbcTemplate的数据查询方法
4.JdbcTemplate的数据写入方法
第二章:Spring编程事务
第三章:Spring声明式事务
1.声明式事务
- 声明式事务指在不修改源码情况下通过配置形式自动实现事务控制,声明式事务的本质就是AOP环绕通知。
- 当目标方法执行成功时,自动提交事务。
- 当目标方法抛出运行时异常时,自动事务回滚。
2.声明式事务配置
Spring 声明式事物管理方式有两种:基于 xml 配置和基于注解实现;
-
基于 xml 配置
<!-- 配置 spring 事务管理类, 并注入数据源 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
-
基于注解实现
<!-- 启用注解形式声明式事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional:声明式事务核心注解
-
放在类上:将声明式事务配置应用于当前类所有方法,默认事务传播为REQUIRED
-
放在方法上:只对该方法生效**(优先级高:方法上的配置比类上的配置优先级高)**
//例如: //非事务,只读,可以用于查询 @Transactional(propagation = Propagation.NOT_SUPPORTED,readOnly = true) //新建事务,可以用于主方法中的嵌套方法 @Transactional(propagation = Propagation.REQUIRES_NEW)
-
3.事务传播方式(小难点:编写程序时使用较少,但属于面试高频问题)
事务传播行为:
- 事务传播行为是指多个拥有事务的方法在嵌套调用时的事务控制方式
- XML:<tx:method name="…" propagation=“REQUIRED”/>
- 注解:@Transactional(propagation=Propagation.REQUIRED)
事务传播行为的七种类型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfBnrLFi-1646925619204)(…/…/…/贺航/Typroa图片/Spring/611e4da40001567219201080.jpg)]
开发中大多数的情况使用PROPAGATION_REQUIRED,在查询语句基本用PROPAGATION_NOT_SUPPORTED,
查询不涉及到对数据的控制,可以用非事务方式进行。
注意:
- propagation_required(默认)–>当类中方法执行时,如果没有事务,则新建一个事务,如果已经存在一个事务,需加入到这个事务中。(这是最常见的用法)这是个传播类型的问题:当一个方法中存在两个及两个以上,同样使用此传播行为的方法时,根据其“已存在事务,则后续开启的事务自动加入到原事务中”的特点。会造成多个事务变成一个“事务”,所以当其中一个方法执行失败时,其它在本次事务中的数据,会一并回滚清除。(无法做到多个事务之间互不干扰的情况),如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3JoYwXK-1646925619205)(…/…/…/贺航/Typroa图片/Spring/600966a9092e2b8e12790621.jpg)]
-
如何让事务之间独立执行,互不干扰呢?(使用PROPAGATION_REQUIRES_NEW)
例如:在主方法startImportJob中嵌套了两个方法importJob1和importJob2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NNpvCk00-1646925619207)(…/…/…/贺航/Typroa图片/Spring/60096858099b426212870378.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5DFnsEm-1646925619208)(…/…/…/贺航/Typroa图片/Spring/60096a0109dd815c12830616.jpg)]
- 事务与非事务的区别:非事务是不以事务的方式提交,也就是说一系列操作并不是一个整体,会各自执行自己的sql。例如:执行以下三条语句 SQL1、SQL2、SQL3,执行三条语句是1、2成功了,3失败了。如果是事务方式:则1、2的执行结果会被撤销,即三条语句都不成功。如果是非事务方式:则1、2执行成功,3失败。