笔记整理来源于尚硅谷,仅供本人复习使用,无其它目的
一、Spring框架概述
二、IOC容器
1.IOC底层原理
(1)IOC定义
①控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。
②使用IOC目的:降低耦合度。
③IOC实现的简单案例
第一步、创建普通类,创建普通方法。
第二步、创建Spring配置文件,在配置文件配置创建的对象。
第三步、测试
(2)IOC底层原理: xml解析、工厂模式、反射。
(3)IOC过程
原始方法:调用包下另一个类的方法,一个修改另一个也要修改
工厂模式
IOC过程
2.IOC容器实现两种方式
3 .IOC操作Bean管理(概念)。
三、IOC操作Bean 管理(xml方式创建对象、注入属性)
1.xml方式创建对象
2.xml方式注入属性
DI(依赖注入,就是注入属性)是IOC的具体实现
常规操作
3.使用set方法注入
(1) 创建类,定义属性和set方法。
(2)在spring配置文件配置对象创建,以及属性的注入。
4.使用有参构造器注入
(1) 创建类,定义属性和构造器。
(2)spring配置文件完成对象创建,和属性注入。
5.p名称空间注入
使用p名称空间注入,可以简化基于xml配置方式
(1)添加p名称空间在配置文件中。
(2)属性注入,在bean标签里面进行操作。
四、IOC操作Bean管理(xml注入其他类型属性)
1.字面量
固定值的属性、对象、数据类型
(1)null值
(2)属性包含特殊字符
2.注入属性-外部bean(ref)
3.注入属性-内部bean(嵌套后赋值)
4.注入属性-级联赋值(外部赋值ref)
(1)第一种写法
(2)第二种写法
给emp添加dept的get()方法,以及再property中用dept.d_Name赋值
5.IOC操作Bean管理(xml注入集合属性)
(1)创建类,定义数组、list、 map、 set 类型属性,生成set的方法
(2)spring配置文件进行配置
<!-- 集合类型注入 -->
<bean id="stu" class="com.spring.collectionType.Stu">
<!-- 数组类型属性注入 -->
<property name="course" >
<array>
<value>大数据</value>
<value>java</value>
<value>python</value>
<value>计算机网络</value>
<value>linux</value>
</array>
</property>
<!-- list集合类型属性注入 -->
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
<value>王麻子</value>
<value>小可爱</value>
</list>
</property>
<!-- map集合类型属性注入 -->
<property name="map">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="PYTHON" value="python"></entry>
<entry key="PHP" value="php"></entry>
</map>
</property>
<!-- set集合类型属性注入 -->
<property name="set">
<set>
<value>吃饭</value>
<value>睡觉</value>
<value>学习</value>
</set>
</property>
</bean>
</beans>
(3) 集合类型属性赋对象类型的值。
(4)、把集合注入部分提取出来,做公共部分(ref相当于引用)
①spring配置文件中引入名称空间util
②util标签完成list集合注入提取
五、IOC操作Bean管理( FactoryBean)
1.、Spring 有两种类型bean,普通bean和工厂 bean (FactoryBean)。
2.、普通bean:在配置文件中定义bean类型和返回类型相同。
如定义为book类型
返回也是Book类型
3、工厂bean: 在配置文件定义bean类型可以和返回类型不一样。
(1)创建类,作为工厂bean,实现FactoryBean接口
(2)实现接口的方法,在实现的方法中定义返回的bean类型,
定义为Mybean 返回为course
六、IOC操作Bean管理(bean作用域)
七、IOC操作Bean管理(bean的生命周期)
1.bean生命周期
①通过无参数构造创建bean实例
②为bean的属性设置值和调用set方法对其他bean引用
③调用bean的初始化的方法(需要进行配置初始化的方法)。
④ bean对象已获取
⑤调用bean的销毁的方法
2.bean的后置处理器,生命周期有7步
①通过构造器创建bean实例(无参数构造)
②为bean的属性设置值和对其他bean引用(调用set方法)。
③把bean实例传递bean后置处理器的方法,postProcessBeforeInitialization
④调用bean的初始化的方法(需要进行配置初始化的方法)。
⑤把bean实例传递bean后置处理器的方法postProcessAfterInitialization
⑥bean可以使用了(对象获取到了)。
⑦当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
为配置文件中的所有bean实例order也添加上后置处理器
八、IOC操作Bean管理(xml自动装配)
1.手动装配
之前通过property标签为属性包括普通类型赋值和对象类型赋值 都是手动赋值,也可以根据bean标签属性autowire配置自动装配(byName和byType)
2.自动装配
(1)byName:根据属性名称注入
注入值bean的id值和类的属性名称一样
(2)byType:根据属性类型注入
根据类型Dept找到对象
但是如果是byType根据属性类型注入,若有多个对象则无法判断是哪一个
九、IOC操作Bean管理(外部属性文件)
1.直接配置数据库信息
(1)配置德鲁伊连接池。
(2)引入德鲁伊连接池依赖jar包
2.引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties 格式文件,写数据库信息。
(2)把外部properties属性文件引入到spring配置文件中,
引入context名称空间。
(3)在spring配置文件使用标签引入外部属性文件。
十、IOC操作Bean管理(基于注解方式)
1.什么是注解
①注解是代码特殊标记,格式: @注解名称(属性名称=属性值,属性名称=属性值…).
②使用注解,注解作用在类上面,方法上面,属性上面。
③ 使用注解目的:简化xml配置s
2.Spring 针对Bean管理中创建对象提供注解
四个注解都可以用来创建bean实例。
① @Component
② @Service
③ @Controller
④ @Repositorye
3.基于注解方式实现对象创建
(1)引入依赖,使用context名称空间
(2)开启组件扫描
(3)创建类,在类上面添加创建对象注解
4.扫描指定的带注解的类
5.基于注解方式实现属性注入
(1) @Autowired: 根据属性类型进行自动装配。
①把People和Animals对象创建,在People和Animals类添加创建对象注解。
②在Animals注入People对象,在Animals类添加People类型属性,属性上面使用注解。
③测试
(2)@Qualifier: 根据属性名称进行注入
(3) @Resource(javax扩展包中的类): 可以根据类型注入,可以根据名称注入
(4)@Value:普通类型注解
6.完全注解开发
十一、AOP
1.什么是AOP?
(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。
2.AOP的底层原理(基于动态代理)
(1)有接口情况,使用JDK动态代理
创建接口实现类代理对象, 增强类的方法,
(2)没有接口情况,使用CGLIB动态代理。
创建子类的代理对象,增强类的方法。
3.AOP(JDK动态代理)
(1)使用JDK动态代理,使用Proxy类里面的方法创建代理对象,调用Proxy.newProxyInstance方法
方法有三个参数:。
第一参数,类加载器。
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口。
第三参数,实现这个接口InvocationHandler,创建代理对象,写增强的方法。
2)、编写JDK动态代理代码。
①创建接口,定义方法。
②创建接口实现类,实现方法。
③使用Proxy类创建接口代理对象。
4.AOP术语
(1)、连接点:可以被增强的方法
(2)、切入点:实际被真正增强的方法
(3)、通知(增强):
①实际增强的逻辑部分称为通知(增强)
②通知类型
*前置通知
*后置通知
*环绕通知
*异常通知
*最终通知(finally)
(4)、切面(是动作):把通知应用到切入点过程
Eg:把权限判断增加到登录的过程
5.AOP操作(准备工作)
(1)、Spring框架一般都是基于AspectJ 实现AOP操作。
- AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spimg.框架一起使用,进行AOP操作。
(2)、基于Aspectl实现AOP操作。
①基于xml配置文件实现。
②基于注解方式实现
(3)、在项目工程里面引入AOP相关依赖。
(4)、切入点表达式。
①切入点表达式作用:知道对哪个类里面的哪个方法进行增强
②语法结构:。
execution([权限修饰符][返回类型][类全路径方法名称
举例1:对com.atguigu.dao.BookDao类里面的add方法进行增强
execution(* com.atguigu.dao.BookDao.add(…))
举例2:对com.atguigu.dao.BookDao类里面的所有方法进行增强
execution(* com.atguigu.dao.BookDao.*(…))
举例3:对com.atguigu.dao包里面所有类,类里面所有方法进行增强,
execution(* com.atguigu.dao.. (…))
6.AOP操作(AspectJ 注解)
(1)创建类,在类里面定义方法
(2)创建增强类(编写增强逻辑)
①在增强类里面,创建方法,让不同方法代表不同通知类型.
(3)通知的配置。
①在spring配置文件中,开启注解扫描。
②使用注解创建Person和PersonProxy_对象。
③在增强类上面添加注解@AspectI
④在spring配置文件中开启生成代理对象。
(4)配置不同类型的通知
在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置。
若增强的show方法出现异常则调用AfterThrowing方法
(5)相同切入点的抽取
(6)有多个增强类多同一个方法进行增强,设置增强类优先级
在增强类上面添加注解@Order(数字类型值),数字类型值越小优先级越高
7.AOP操作(AspectJ 配置文件)
8.完全使用注解开发
十二、事务
1、什么是事务
(1)事务是数据库操作最基本单元,逻辑上一-组操作,要么都成功,如果有一个失败所有操
作都失败。
(2)典型场景:银行转账。
lucy转账100元给mary.
lucy少100,mary多 100。
2、事务四个特性(ACID)
(1)原子性。要么都成功,要么都失败
(2)一致性。操作前和操作后总量不变
(3)隔离性。多事务操作的时候。彼此之间不受影响
(4)持久性。事务提交后,表中的数据真正发生变化,之后不再改变
3.事务操作(搭建事务操作环境)
(1)创建数据库表,添加记录
(2)、创建service, 搭建dao, 完成对象创建和注入关系,
service注入dao, 在dao注入JdbcTemplate, 在JdbcTemlate注入DataSource
(3)、 异常
编程式事务管理
4.事务操作(Spring 事务管理介绍)
(1)、事务添加到JavaEE三层结构里面Service层(业务逻辑层)。
(2)、在Spring进行事务管理操作。
有两种方式:编程式事务管理和声明式事务管理(使用)。
(3)、声明式事务管理.
①基于注解方式
②基于xm|配置文件方式。
(4)、在Spring进行声明式事务管理,底层使用AOP原理。
(5)、Spring 事务管理API,
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
5.事务操作(注解声明式事务管理)
(1)、在spring配置文件配置事务管理器
(2)开启事务管理
(3)、在service类上面(或者service类里面方法上面)添加事务注解
① @Transactional,这个注解添加到类上面,也可以添加方法上面。
②如果把这个注解添加类上面,这个类里面所有的方法都添加事务。
③如果把这个注解添加方法上面,为这个方法添加事务
6.事务操作(声明式事务管理参数配置)
(1)、在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数:
(2)、propagation: 事务传播行为
事务方法直接进行调用,这个过程中事务是如何进行管理的
区别在于第一个是被调用的那个update方法使用add的事务。最后一个是在add的事务里面再嵌套了个事务
(3)、ioslation: 事务隔离级别
①事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题。
②有三个读问题:脏读、不可重复读、虚(幻)读
脏读:一个未提交事务读取到另一个未提交事务的数据。
不可重复读:一个未提交事务读取到另一个已提交事务修改的数据。在一个事务里面读取了两次某个数据,读出来的数据不一致。
虚读:一个未提交事务读取到另一提交事务添加的数据。在一个事务里面的操作中发现了未被操作的数据
③解决:通过设置事务隔离级别,解决读问题。
mysql默认的隔离级别为:可重复读(REPEATABLE READ)
(4)、timeout: 超时时间
①事务需要在一-定时间内进行提交,如果不提交进行回滚+
②默认值是-1,设置时间以秒单位进行计算。
(5)、readOnly: 是否只读
①读:查询操作,写:添加修改删除操作。.
② readOnly 默认值false,表示可以查询,可以添加修改删除操作。
③设置readOnly值是true,设置成true之后,只能查询。
(6)、rollbackFor: 回滚
设置出现哪些异常进行事务回滚。
(7)、noRollbackFor: 不回滚
设置出现哪些异常不进行事务回滚
7.事务操作(xml声明式事务管理)
在spring配置文件配置事务管理器。
8.事务操作(完全注解开发)
package shiwu.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration//配置类
@ComponentScan(basePackages = "shiwu")//开启组件扫描
@EnableTransactionManagement//开启事务
public class TxConfig {
//创建数据库连接池
@Bean//表示方法返回的是对象。然后对象交给I0C管理。
public DruidDataSource getDruidDataSource(){
//创建德鲁伊连接池
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/user_db");
dataSource.setUsername("root");
dataSource.setPassword("18291759055");
return dataSource;
}
//创建JdbcTemplate模板对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//IOC容器中已存在一个dataSource对象,到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
//注入dataSource
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}