Spring学习简要

前言

  • Spring是什么?
    • 是一个框架
  • Spring能干什么?
  • Spring的体系 结构:Spring学习简要_第1张图片

一、核心窗口

IOC(Inversion Of Control 控制反转)

  • 使用对象时,从主动new新对象转换为由外部提供对象,创建对象的控制权转移到外部,所以称为控制反转
  • “外部”指的是Spring提供的IOC容器
  • 在IOC容器中被创建和被管理的对象统称为 Bean 
  • 绑定具有依赖关系的多个对象,用DI
  • IOC和DI的最终目标是充分解耦

DI(Dependency Injection 依赖注入) 

  • setter注入

    • Spring学习简要_第2张图片
    • 引用类型:使用
    • Spring学习简要_第3张图片
    • 简单类型(基本数据类型与String):使用
  • 构造器注入

    • 引用类型:声明属性;提供构造方法;修改配置文件
    • Spring学习简要_第4张图片
    • 简单类型
  • 建议使用setter注入

  • Spring学习简要_第5张图片

Spring通过IOC容器管理bean对象 

  1. 通过Spring框架提供的接口,获取IOC容器
  2. 通过配置文件告知IOC容器要管理哪些bean对象
  3. 通过Spring提供对应接口的方法获取IOC容器中的bean对象
  4. 在pom.xml添加对应的依赖

 bean

  • bean的配置:

    • bean的基础配置:id, class
      • 无法通过id或name获取到指定的bean时,会抛出NoSuchBeanDefinitionException异常
    • bean的别名配置:name
    • bean的作用范围配置:scope
      • bean为单例,即Spring在IOC容器中只会有该类的一个对象,提高对象的复用率
bean标签的各属性
id 在一个容器中id值唯一
class class为bean的类型,即配置的bean的全路径类名  
name 定义bean的别名,可定义多个,使用逗号或分号或空格分隔
scope

定义bean的作用范围

单例即多个对象的地址值相等

  • singleton:单例(默认)
  • prototype:非单例
ref 指向spring的IOC容器中其他的bean对象
autowire 开启自动装配,通常使用按类型装配
Spring学习简要_第6张图片
  • bean的实例化(先创建bean对象,后实例化bean)

    • 方式一:构造方法(常用)
    • 方式二:静态工厂(一般用来兼容早期的老系统,了解为主)
    • 方式三:实例工厂(配置较复杂,故用FactoryBean来简化开发)
  • bean的生命周期控制 

    • 控制生命周期的主要方式:在配置文件中的bean标签里添加 init-method 和 destroy-method 两个属性
    • bean的生命周期控制位于执行bean的初始化方法和销毁方法之间
    • ClassPathXmlApplicationContext是ApplicationContext的子类,它有close()方法和registerShutdownHook()两个方法可以用于关闭容器

自动配置 

  • 定义:IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中
  • 常用方式:按类型注入
  •  自动装配级别低于setter注入和构造器注入
  • 自动装配只能对引用类型进行注入,无法对简单类型进行操作

集合注入

  • 集合中既可以装简单数据类型,也可以装引用数据类型
  • 常见集合类型:数组,List, Set,  Map, Properties
  • 
    
                
                    100
                    200
                    300
                
            
            
                
                    itcast
                    itheima
                    boxuegu
                
            
            
                
                    itcast
                    itheima
                    boxuegu
                
            
            
                
                    
                    
                    
                
            
            
                
                    china
                    
                    kaifeng
                
            

IOC/DI配置管理第三方bean

  • 第三方类指的是DruidDataSource
  • 使用setter注入方式注入数据库连接四要素 
    数据库四要素 
    driverClassName 数据库驱动
    url 数据库连接地址
    username 数据库连接用户名
    password 数据库连接密码
  • 为了利于后期维护,把数据源的相关配置提炼到一个外部配置文件properties中:Spring学习简要_第7张图片
  • 开启context空间,以便读取外部配置信息Spring学习简要_第8张图片
  • 读取外部配置信息:Spring学习简要_第9张图片

核心容器 

1、如何创建容器?

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

2、创建好容器后,如何从容器中获取bean对象

  1. BookDao bookDao=(BookDao)ctx.getBean("bookDao"); //需要类型转换
  2. BookDao bookDao=ctx.getBean("bookDao",BookDao.class);
  3. BookDao bookDao=ctx.getBean(BookDao.class); //只能有一个bean对象

3、容器的最上级的父接口为BeanFactory

4、使用BeanFactory创建的容器是延迟加载,而使用ApplicationContext创建的容器是立即 加载。ApplicationContext接口常用初始化类ClassPathXmlApplicationContext

纯注解开发模式

  • 按类型注入:@Autowired
  • 按名称注入:@Autowired和@Qualifier
@Autowired
  • 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
  • 暴力反射能获取public和private修饰的内容
  • setter方法的普通反射只能获取public修饰的内容,所以使用自动装配后,要把setter方法删掉
  • 是按类型注入,如果对应的接口有多个类,就要按名称注入@Qualifier
  • @Qualifier必须和@Autowired一起使用
@Value 一般会被用于从properties配置文件中读取内容进行使用

IOC/DI注解开发管理第三方bean

第三方类在jar包中,无法直接在类上添加注解来定义bean,故引进@Bean注解

二、AOP

AOP(Aspect Oriented Programming,面向切面编程)

  • 定义:AOP是一种编程范式,指导开发者组织程序结构
  • 作用:在不改变原始代码设计的基础上进行功能增强
  • 核心概念:
    • 连接点(JoinPoint):方法的执行
    • 切入点(Pointcut):描述一个具体方法,或者匹配多个方法
    • 通知(Advice):在切入点处执行的操作
    • 切面(Aspect):描述通知与切入点之间的关系
    • 通知类:定义通知的类
    • 目标对象(Target):原始功能去掉共性功能后对应的类产生的对象
    • 代理对象(Proxy):对原始对象创建代理对象,在代理对象中的方法把通知的内容加进去,就实现了增强 
  • 工作流程:
    • 启动Spring容器
    • 读取所有切面配置中的切入点
    • 初始化bean,判断bean对应的类中的方法是否可以匹配到任意切入点
      • 匹配失败,使用原始对象
      • 匹配成功,产生代理对象
    • 获取bean执行方法
      • 要么调用原始对象的原始方法,要么调用代理对象的方法
      • 即要判断容器中的,是否为代理对象
      • 主要是打印增强前后的类的getClass()方法,比较结果
      • 如:
        • 代理对象:
        •  原始对象:

AOP配置管理

  • AOP切入点表达式:
    • 语法格式:
      • 如:@Pointcut("execution(void com.study.dao.BookDao.update())")
      • 动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数名))
    • 通配符
      • * :单个独立的任意符号
      • .. :多个连续的任意符号
      • + :专用于匹配子类类型
      • execution(void com.itheima.dao.BookDao.update())
        匹配接口,能匹配到
        execution(void com.itheima.dao.impl.BookDaoImpl.update())
        匹配实现类,能匹配到
        execution(* com.itheima.dao.impl.BookDaoImpl.update())
        返回值任意,能匹配到
        execution(* com.itheima.dao.impl.BookDaoImpl.update(*))
        返回值任意,但是update方法必须要有一个参数,无法匹配,要想匹配需要在update接口和实现类添加
        参数
        execution(void com.*.*.*.*.update())
        返回值为void,com包下的任意包三层包下的任意类的update方法,匹配到的是实现类,能匹配
        execution(void com.*.*.*.update())
        返回值为void,com包下的任意两层包下的任意类的update方法,匹配到的是接口,能匹配
        execution(void *..update())
        返回值为void,方法名是update的任意包下的任意类,能匹配
        execution(* *..*(..))
        匹配项目中任意类的任意方法,能匹配,但是不建议使用这种方式,影响范围广
        execution(* *..u*(..))
        匹配项目中任意包任意类下只要以u开头的方法,update方法能满足,能匹配
        execution(* *..*e(..))
        匹配项目中任意包任意类下只要以e结尾的方法,update和save方法能满足,能匹配
        execution(void com..*())
        返回值为void,com包下的任意包任意类任意方法,能匹配,*代表的是方法
        execution(* com.itheima.*.*Service.find*(..))
        将项目中所有业务层方法的以find开头的方法匹配
        execution(* com.itheima.*.*Service.save*(..))
        将项目中所有业务层方法的以save开头的方法匹配
    • 书写技巧:精准搜索,提高效率,但又不要耦合度过高,

AOP通知类型:(通知要添加到切入点的哪个位置)

  • 前置通知:@Before, 追加功能到方法执行前
  • 后置通知:@After, 追加功能到方法执行后(不论有没有异常抛出)
  • 返回后通知:@AfterReturning, 只有方法正常执行结束后才追加功能到方法执行后
  • 抛出异常通知:@AfterThrowing, 只有方法执行出异常才追加功能到方法执行后
  • 环绕通知:@Around, 追加功能到方法执行的前后,若接收返回值,返回类型通常设为Object
  • Spring学习简要_第10张图片

AOP通知获取数据

  • 获取参数:       
    • JointPoint:适用于前置、后置、返回后、抛出异常后通知
      • Spring学习简要_第11张图片
    • ProceedingJointPoint:适用于环绕通知,使用getArgs()方法
      • Spring学习简要_第12张图片
  • 获取返回值:
    • 返回后通知
    • 环绕通知
      • Spring学习简要_第13张图片

  • 获取异常 :
    • 抛出异常后通知
    • 环绕通知
      • Spring学习简要_第14张图片

采用Spring整合AspectJ的方式进行AOP开发 

1、

@Component
@Aspect//标识为切面类,绑定切入点和通知之间的关系
public class MyAdvice {//定义通知类和通知
    @Pointcut("execution(void com.study.dao.BookDao.update())")//定义切入点
    private void pt(){}

    @Before("pt()") //通知会在切入点方法执行之前执行
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

2、使用注解@Pointcut, @Before, @Aspect, @EnableAspectJAutoProxy, 

三、事务

Spring事务:

  • 作用:在数据层或业务层保障一系列的数据库操作同成功同失败
//Spring管理事务
public interface PlatformTransactionManager{
    void commit(TransactionStatus status) throws TransactionException;//提交事务
    void rollback(TransactionStatus status) throws TransactionException;//回滚事务
}
  • Spring事务角色
    • 事务管理员:在Spring中通常指代业务层开启事务的方法
    • 事务协调员:在Spring中通常指代数据层或业务层方法
  • Spring事务属性
    • 事务配置
      • Spring学习简要_第15张图片
    • 业务追加日志
      • Spring学习简要_第16张图片
    • 事务传播行为
      • Spring学习简要_第17张图片

四、整合

Spring整合Mybatis

1、Spring要管理Mybatis中的SqlSessionFactory,用到SqlSessionFactoryBean类

2、Spring要管理Mapper接口的扫描,用到MapperScannerConfigurer类

Spring整合Junit

1、Junit是基于Spring环境运行的,使用了专用的类运行器SpringJUnit4ClassRunner

  • 2、使用配置@RunWith和@ContextConfiguration

你可能感兴趣的:(java框架,spring,java)