Ioc:控制反转,将创建对象和对象之间的调用过程交给spring进行管理
Aop:面向切面,不修改代码,对功能进行增强
IOC
底层原理
(1)xml解析,工厂模式,反射
通过xml解析,获取类路径,再通过反射加载类,创建对象
接口
1.ioc思想是基于ioc容器,ioc容器底层是对象工厂
2.Spring提供ioc容器实现方式:
①BeanFactory
Ioc容器基本实现,spring内部接口,加载配置文件时,不会创建对象,获取对象使用时,才会创建对象。
②ApplicationContext
BeanFactory的子接口,提供更多强大的功能,一般开发用,加载配置文件时,会创建对象。
ClassPathXmlApplicationContext:src路径下的配置文件
FileSystemXmlApplicationContext:系统盘的路径下的配置文件
IOC操作Bean管理
内容:
(1)Spring创建对象
(2)Spring注入属性
方式:
一、基于xml配置文件实现
- 创建对象
①使用Bean标签,标签添加对应属性
②id属性:唯一标识 (类似名字)class属性:类全路径
③创建对象时,默认执行无参构造
- 注入属性
①DI:依赖注入,即注入属性
a. 使用set方法
α.properties标签
name类属性名,(.xxx 需要有get方法,可实现级联赋值)
value向属性注入的参数
ref向属性注入外部bean(可实现级联赋值)
<bean>向属性注入内部bean
β.使用p名称空间注入
添加p名称在配置文件中
bean标签 p:xxx (属性名)= ""(参数)
b.使用有参构造
constructor-arg标签 name类属性名(index属性名下标),value向属性注入的参数
c.注入数组,list,map,set类型(①集合中设置对象 ②提取集合提取util并注入)
*当设值为null <properties><null/>
*当设值为带特殊符号<value><![CDATA[]]>
spring有两种bean:
- 普通bean:在配置文件中定义类型与返回类型一致
- 工厂bean(FatoryBean):在配置文件中定义类型与返回类型可以不一致
bean的作用域:spring中bean默认时单实例对象
在配置文件可设置scope:
singleton(默认值,单例):加载配置文件就会创建单实例对象
prototype(多例):获取对象使用getBean时,才会创建多实例对象
bean生命周期
(生命周期:从对象创建到对象销毁的过程)
若有bean后置处理器:加上红色两步
(1)通过构造器创建bean实例(无参构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递到bean后置处理器的方法postProcessBeforeInitialization
(4)调用bean的初始化方法(需要进行配置初始化的方法)
(5)把bean实例传递到bean后置处理器的方法postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
xml自动装配autowire
(1)根据属性进行自动装配byName
(2)根据类型进行自动装配byType
外部属性注入
引入context名称空间,context:property-placeholder location="class:"加载properties文件
value="${(properties文件的key)}"
二、基于注解方式实现
注解:@名称(属性名=属性值),作用于类,方法,属性,简化xml配置
xml加注解
1.创建对象:
(1)类上加注解
@Component
@Service
@Controller
@Repository
四个功能都一样,都是创建bean实例
(2)xml配置context,context:component-scan ,添加要扫描的类包,可自定义只扫描哪些注解,或者哪些注解不扫描
2.属性注入
(1)@Autowired:根据属性类型进行自动装配
(2)@Qualifier:和Autowired一起可实现根据属性名称进行注入
(3)@Resource:可以根据类型注入,可以根据名称注入
(4)@value:注入普通类型属性
完全注解开发
1.用配置类替代xml
@Configuration
@ComponentScan(basePackages = {"com.mg.spring5.annotate"})
2.启动类需要 new AnnotationConfigApplicationContext(xxxxx.class)
AOP
定义:面向切面编程,利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可复用性,同时提高了开发效率。即,不通过修改源代码,在主干功能里添加新功能。
底层原理
动态代理
(1)有接口情况,使用JDK动态代理(创建接口实现类代理对象,增强类的方法)
①使用proxy类里面的方法创建代理对象
调用newProxyInstance方法
三个参数:
a.类加载器
b. 增强方法所在的类,这个类实现的接口,支持多个接口
c. 实现这个接口InvocationHandler,创建代理对象,写增强的方法
(2)没有接口情况,使用CGLIB(创建子类的代理对象,增强类的方法)
aop术语
1.连接点(类中可以被增强的方法)
2.切入点(实际被真正增强的方法)
3.通知(增强)(实际增强的逻辑部分)
类型:前置,后置,环绕,异常,最终
4.切面(一个动作:把通知应用到切入点的过程)
AOP操作
spring框架是基于AspectJ实现AOP操作。
AspectJ是独立的AOP框架,和spring结合使用实现AOP操作。
实现方式:
(1)xml配置文件
(2)注解
切入点表达式:
execution ( [ 权限修饰符 ] [ 返回类型(可不写) ] [ 类的全路径 ] [ 方法名称 ] [ 参数列表 ] )
execution(* com.mg.spring5.aopExample.Dao.*.*(..)) 【* == 所有】
抽取相同切入点:
@PrintCut ,用方法代替切入点表达式
多个增强类设置优先级:
@Order() int类型数值,数值越小,优先级越大
JDBCTemplate
spring框架对Jdbc进行封装,使用JdbcTemplate实现对数据库操作
(1)xml配置文件配置数据库连接池
(2)xml配置JdbcTemplate对象,注入dataSource
(3)创建Dao和Service,注入JdbcTemplate对象
dao注入jdbcTemplate,service注入dao
(4)创建数据库对应实体类entity
(5)创建Dao和Service
service调用dao方法
在dao写方法对数据库进行操作,调用JdbcTemplate对象的update方法实现操作(sql,args)
事务管理
事务添加到service业务逻辑层
1. 编程式事务:try-catch回滚
2. 声明式事务:底层使用AOP原理
(1)注解+xml方式
xml配置创建事务管理器
开启事务注解扫描
在需要事务的类或者方法上加注解@Transactional
注解参数配置
①事务传播行为 7种
②事务隔离级别
③超时时间:未在规定时间提交事务--回滚,默认值-1,即不开启
④只读:是否只可查询,默认值为false
⑤回滚:设置哪些异常进行回滚
⑥不回滚:设置哪些异常不进行回滚
(2)xml
创建事务管理器
配置通知
配置aop切入点和切面
(3)完全注解
Spring5新特性/功能
日志
Spring5自带通用的日志封装;移除了Log4jConfigListener,使用Log4j2
引入xml 或者 自定义log类
调整级别:日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
支持@Nullable注解
用于方法参数里:方法参数可为空
用于方法上:方法返回值可以为空
用于属性上:属性值可为空
函数式风格创建对象
交给spring管理
支持整合Junit5
单元测试Juit4
单元测试Juit5
双注解:
复合注解:
SpringWebFlux
Spring5添加的新模块,用于web开发的,与SpringMVC功能类似,WebFlux使用当前一种比较流行响应式编程出现的异步非阻塞框架,基于Reactor的相关API实现。
特点:(1)非阻塞式:在有限资源下, 提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程(2)函数式编程:实现路由请求;
与SpringMVC区别:
(1)两个框架都可以采用注解方式,都运行在Tomcat中
(2)SpringMVC采用命令式编程,WebFlux采用异步响应式编程