Spring5-IOC、AOP、事务管理

笔记整理来源于尚硅谷,仅供本人复习使用,无其它目的

一、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;

    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值