IoC控制反转核心概念:为了解决程序耦合度偏高问题,使用对象时,在程序中不要主动使用new 产生对象,转换为由外部提供对象。Spring技术对IoC思想进行了实现,它提供了一个容器,称为IoC容器,用来充当IoC思想中的外部。IoC容器负责对象的创建、初始化等工作,被创建和管理的对象被称为Bean。
DI依赖注入核心概念:因为业务层的实现需要依赖dao对象运行所以IoC容器在内部还提供了service和dao的依赖称为DI依赖注入。这样我们在使用对象时不仅可以直接从IoC容器中获取,并且能获取到bean已经绑定了所有的依赖关系。
IoC思路分析:
- 管理什么?(Service和Dao)
- 如何将被管理的对象告知IoC容器?(用配置)
- 被管理的对象交给IoC容器,如何获取到IoC容器?(用接口)
- IoC容器得到后,如何从容器中获取bean?(用接口方法)
实现:
(1)先导入Spring坐标,(2)定义Spring管理的类(接口),(3)创建Spring配置文件,配置对应类作为Spring管理的bean,运行就即可。
DI思路分析:
- 基于IoC管理bean
- Service中使用new形成创建的Dao对象能不能保留?(不能)
- Service中需要的Dao对象如何进入到Service中?(提供方法)
- Service与Dao间的关系如何描述?(配置)
实现:
(1)删除使用new的形式创建对象的代码,(2)提供依赖对象对应的setter方法,(3)配置service与dao之间的关系。
实例化bean的三种方式:(1)构造方法 常用,(2)静态工厂 了解,(3)实例工厂 了解,(4)FactoryBean 实用。
生命周期:从创建到消亡的完整过程。
Bean生命周期:bean从创建到销毁的整体过程过程。
Bean生命周期控制:在bean创建后到销毁前做一些事情。提供生命周期控制方法,还有一个是使用接口控制但了解就行。
Bean生命周期:
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
- 使用bean
- 执行业务操作
- 关闭/销毁容器
- 执行bean销毁方法
Bean销毁时机:容器关闭前要触发bean的销毁。
- 关闭容器容器方式:
- 手动关闭容器
ConfigurableApplicationContext接口Clouse()操作
- 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
ConfigurableApplicationContext接口registerShutdownHook()操作
使用接口控制不推荐,了解就行。
依赖注入方式:
-
- Setter注入
- 简单类型
- 应用类型
- 构造器注入
- 简单类型
- 应用类型
Setter注入应用类型在前面已经写的差不多了所以我这边就不用再做一遍。
简单类型注入:在bean中定义引用类型属性并提供可访问的set方法,在配置中使用property标签value属性注入简单类型数据。
构造器注入应用类型了解即可,配置中使用constructor-arg标签ref属性注入引用类型对象。参数适配也是了解即可,配置中使用constructor-arg标签type属性设置按形参类型注入。或者配置中使用constructor-arg标签index属性设置按形参类型注入。
依赖注入方式选择:
1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现。
2. 可选依赖使用setter注入进行,灵活性强。
3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨。
4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入。
5. 实际开发过程中还要根据实际情况分析,如果受控空对象没有提供setter方法就必须使用构造器注入。
6. 自己开发的模块推荐使用setter注入。
依赖自动装配:IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。自动装配的方式有按类型(常用),按名称,按构造器方法,不启用自动装配。
配置中使用bean标签autowire属性设置自动装配的类型,自动装配用于应用类型依赖注入,不能对简单类型进行操作。使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用。使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用。自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。
集合注入:array,list,set,map,properties:
数据源对象管理:导入坐标,配置数据源对象作为spring管理的bean。
加载properties文件:开启context命名空间,使用context命名空间,加载指定properties文件,再使用${ }读取加载的属性值。
最标准的加载properties文件标准格式:
容器:创建容器我们有三种方式:类路径加载配置文件,文件路径加载配置文件,加载多个配置文件。获取bean的方式也有三种:使用bean名称获取,使用bean名称获取并指定类型,使用bean类型获取(但容器中这个类型的bean只能有一个不然会报bean不是唯一的异常)。
核心容器总结:容器相关。
bean相关:
依赖注入相关:
注解开发:注解开发定义bean时,使用@Component定义bean然后用核心配置文件中通过组件扫描加载bean。
Spring提供@Component注解的三个衍生注解:
- @Controller:用于表现层bean的定义
- @Service:用于业务层bean的定义
- @Repository:用于数据层bean的定义
纯注解开发:
Spring3.0升级了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道,读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象。Java类代替Spring核心配置文件。@Configuration注解用于设定当前类为配置类,@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式。
注解开发bean作用范围合生命周期管理:
使用@Scope定义bean作用范围(也可以不写)毕竟我们通常需要单例的bean,使用@PostConstruct、@PreDestroy定义bean生命周期。
注解开发依赖注入:
使用@Autowired注解开启自动装配模式(按类型),注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法,自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法。使用@Qualifier注解开启指定名称装配bean,注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用。使用@Value实现简单类型注入。使用@PropertySource注解加载properties文件,注意:路径仅支持单一文件配置,多文件要使用数组格式配置,不允许使用通配符*。
注解开发管理第三方bean:
使用@Bean配置第三方bean,使用独立的配置类管理第三方bean,将独立的配置类加入核心配置。导入式:使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式。扫描式:使用@ComponentScan注解扫描配置类所在的包,加载对应的配置类信息(不推荐使用)。
简单类型注入:
应用类型依赖注入:只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象。
注解开发总结:XML配置比对注解配置。
Spring整合Mybatis:整合mybatis。
Spring整合Junit:使用Spring整合Junit专用的类加载器。
AOP简介:
- AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。就像OOP(Object Oriented Programming)面向对象编程一样是一种思想。
- 作用:在不惊动原始设计的基础上为其进行功能增强。
- Spring理念:无入侵式/无侵入式。
AOP核心概念:
1)导入aop相关坐标,spring-context坐标依赖spring-aop坐标。
2)定义dao接口与实现类。
3)定义通知类,制作通知。
4)定义切入点,切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑。
5)绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置。
6)定义通知类受Spring容器管理,并定义当前类为切面类。
7)开启Spring对AOP注解驱动支持。
AOP工作流程:
- Spring容器启动。
- 读取所有切面配置中的切入点。
- 初始化bean,判定bean对应的类中的方法是否匹配到任意切入点。
- 匹配失败,创建对象。
- 匹配成功,创建原始对象(目标对象)的代理对象。
- 获取bean执行方法。
- 获取bean,调用方法并执行,完成操作。
- 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。
目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的。
代理对象(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现。
AOP切入点表达式:
- 切入点:要进行增强的方法。
- 切入点表达式:要进行增强的方法描述方式。
- 切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名(参数)异常名)。
AOP通知类型:
AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置。
AOP通知分为五种类型:前置通知、后置通知、环绕通知(重点)、返回后通知(了解)、抛出异常后通知(了解)。
案例:测量业务层接口万次执行效率:
需求:任意业务层接口执行均可显示其执行效率(执行时长)
分析:业务功能:业务层接口执行前后分别记录时间,求差值得到执行效率。通知类型选择前后均可以增强的类型——环绕通知。
补充说明:当前测试的接口执行效率仅仅是一个理论值,并不是一次完整的执行过程。