因为没有用markdown编辑器 建议缩小网页来看 大概百分之70左右效果更好
2020/5/28
Spring
简介
2002年首次出现Spring框架雏形interface21
在2004年发布正式版,创始人Rod Johnson的专业是音乐学
Spring的理念:让现有的技术更加容易使用,整合了现在所有的技术框架
优点
Spring是一个开源的免费的框架!
Spring是一个轻量级的、非入侵式的框架!
控制反转IOC,面向切面编程AOP
支持事务的处理,对框架整合的支持
总结一句话:Spring是一个轻量级的控制反转(IOC)和面向切面的(AOP)的框架
弊端:Spring发展了太久之后,配置太过繁杂。配置文件里面的东西很难理解
IOC引导
图1 利用set动态实现值得注入
利用这个set方法就可以从程序员new一个新对象变成客户new一个所需要得对象
图2 ioc本质
IOC本质:获得依赖对象的方式反转了,控制反转是一种通过(xml或者注解)并通过第三方生成或获取特定对象的方式,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)
图3 IOC解耦
图4 bean注入和原来new对象区别
这些实体类通过类中的无参构造注入 如果类中没有无参构造记得添加 否则在Spring中会注入失败
2020/5/29
要实现不同的操作,只需要在xml配置文件中进行修改,所谓的ioc:对象由Spring来创建,管理、装配
IOC创建对象的方式 是在xml中配置bean注入
图5 有参构造的三种创建对象方式
总结:在配置文件加载的时候,容器中管理的对象(所有)就已经初始化了!
Spring配置
图6 别名的配置
图7 bean的配置
图8 applicatonContext的import配置
依赖注入(DI)
构造器注入
前面已经写过了
set方法注入(属性的注入)
<bean id="address" class="com.cqh.model.Address">bean>
<bean id="student" class="com.cqh.model.Student">
<property name="name" value="cqh">property>
<property name="address" ref="address">property>
<property name="books">
<array>
<value>1value>
<value>2value>
<value>3value>
<value>4value>
array>
property>
<property name="hobbies">
<list>
<value>avalue>
<value>bvalue>
<value>cvalue>
<value>dvalue>
list>
property>
<property name="games">
<set>
<value>xxvalue>
<value>xxvalue>
<value>xxvalue>
<value>Xxvalue>
set>
property>
<property name="card">
<map>
<entry key="1" value="2">entry>
<entry key="2" value="2">entry>
<entry key="3" value="2">entry>
<entry key="4" value="2">entry>
map>
property>
<property name="info">
<props>
<prop key="1">432prop>
<prop key="2">432prop>
<prop key="3">432prop>
<prop key="4">432prop>
props>
property>
<property name="wife" value="false">property>
bean>
拓展方式注入
用p命名 c命名空间来注入
p空间就是property
c空间就是construct-args
图9 用P命名空间、C命名空间进行注入
注意:注入需要导入相应xml约束
bean的作用域:
图10 bean的作用域
图11 作用域详解
2020/6/1
Bean的自动装配
自动装配是Spring满足bean依赖一种方式
Spring会在上下文中自动寻找,并自动给Bean装配属性
在Spring中有三种装配方式
在xml中显式的配置
在java中显式配置
隐式的自动装配bean
ByName自动装配 会自动在容器上下文查找和自己对象setXXX()方法后面的值对应的beanId
图12 在bean配置autowire自动装配
ByType装配
图13 byType自动配置
小结:
byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性set方法的值一致
byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的set方法的值一致
使用注解自动装配
导入约束 context
配置注解的支持
@Autowired
直接在属性上使用即可,也可以在set方法上使用
使用autowird后可以不用编写set方法了,前提是你这个自动装配的属性在IOC(Spring)容器 (配置了bean属性)
图14 自动装配使用方式
原理实现:通过反射机制来实现访问,所以不需要写set方法
可以配合@qualifier来指定一个唯一的bean对象注入
@Nullable 如果某个字段标记了这个注解后,说明这个字段可以为null
@Autowired 里面有个参数required可以为false,说明这个字段可以为null,否则不允许为空
@Resource注解 也可以实现和@autowired一样的功能
注意:@Resource注解是Java自带的注解
使用注解开发
注解说明
@Component:组件,放在类上,说明这个类被Spring管理了就是Bean
衍生的注解
dao层 @Repository
service层 @Service
controller层 @Controller
@Value 可以用来注入属性 可以在setXXX()方法上直接注入值
图15 @Value的属性配置
@Scope 作用域注解 里面可以有prototype和singleton
xml与注解:
xml更加万能,适用于任何场合!
注解 不是自己的类使用不了 维护相对复杂
xml与注解最佳实践
1.xml用来管理bean
2.注解只负责完成属性的注入
3.在使用的过程,想让注解生效,必须开启对注解的支持
图16 Spring注解开发两个关键配置
2020/6/2
Java类实现Spring配置
图17 Java类可以做到和注入bean一样
现在完全可以做到不适用Spring的xml配置了,全权交给Java来做。
JavaConfig是Spring的一个子项目,在Spring4后,它成为了一个核心功能
图18 通过configuration注入和依赖注入方式的区别
图19 配置类方式去做需要通过AnnotationConfig来获取容器
这种纯Java的配置方式,在SpringBoot中随处可见
SpringAOP(核心)
代理模式 这是SpringAOP的底层
代理模式的分类
静态分类
动态代理
图20 代理模式化成现实图
静态代理
角色分析
抽象角色:一般使用接口或者抽象类来解决 要做的事
真实角色:被代理的角色 例如房东
代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作 例如中介
客户:访问代理对象的人
2020/6/3
静态代理
代码步骤
接口(业务接口)
图21 接口(要做的事 业务接口)
真实角色(业务实现类)
图22 真实角色(业务实现类)
代理角色
图23 代理
客户端访问代理角色
图24 客户
静态代理模式的好处:
可以让真实角色操作更加纯粹 不用去关注一些公共的业务
公共页就交给代理角色 实现了业务的分工
公共业务发生拓展的时候,方便集中管理
缺点
一个真实角色就会产生一个代理角色;代码量会翻倍~开发效率会变低
AOP图解
图25 AOP图解
动态代理
动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口---jdk动态代理 【学习】
基于类:cglib
java字节码实现:javasist
需要了解两个类:Proxy:代理,InvocationHandler:调用处理程序
动态代理比静态代理还多的好处:
一个动态代理类代理的是一个接口类,而不是静态代理中一个接口类中的一个方法,一般就是对应的一类业务
一个动态代理类可以代理多个实现类,只要是实现了同一个接口即可!
2020/6/4
使用Spring实现AOP
图26 首先需要导入AOP依赖包
方式一:使用Spring的API接口【主要SpringAPI接口实现】
图27 通过advice-ref关联需要拓展的方法,通过pointcut来注入
图28 将方法的类注入Spring
方法二:自定义来实现AOP【主要是切面定义】
图29 通过自定义类来注入
图30 自定义类
方式三:使用注解实现
图31 注解实现方式 直接写在类上
图32 applicationContext的配置 需要加入
整合MyBatis
按照MyBatis的规则,mapper中的类 要么和在resource中的mapper.xml对应 包名什么都一致
如果不按照mybatis规则 就在maven中加入这个过滤 否则按照mybatis的规则,maven不会扫描到mapper.xml
图32 maven解决MyBatis原有配置规则
MyBatis-Spring
MyBatis-Spring 会帮助你将MyBatis代码无缝地整合到Spring 中。它将允许MyBatis参与到Spring的事务管理之中,创建映射器mapper和sqlsession并注入到bean中,以及将Mybatis的异常转换为Spring的DataAccessException。 最终,可以做到应用代码不依赖于MyBatis, Spring 或MyBatis-Spring。
第一种方式
编写数据源配置
sqlSessionFactory
sqlSessionTemplate
给接口加实现类
将自己写的实现类,注入到Spring中
测试使用即可
第二种实现方式和第一种不一样的就是
省略sqlsessionTemplate 继承SqlSessionDaoSupport
在Moudle spring10-mybatis
声明式事务
回顾事务
把一组业务当成一个业务来做,要么都成功,要么都失败
事务写在项目开发中,十分重要,设计到数据一致性的问题
确保完整性和一致性
事务的ACID原则
原子性
一致性
隔离性
多个业务可能操作同一个资源,防止数据损坏
持久性
事务一旦提交,无论系统发生什么问题,结果都不会再被影响,会被持久化的写到存储器中
2020/6/5
Spring中的事务管理
声明式事务:AOP
编程式事务:需要在代码中进行事务 用try catch来包裹代码 最后用rollback回滚(代码实现)