Spring学习《狂神说Java》 笔记

因为没有用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注入

  1. 使用无参构造创建对象,默认方法

  2. 假设我们要使用有参构造创建对象。

图5 有参构造的三种创建对象方式

总结:在配置文件加载的时候,容器中管理的对象(所有)就已经初始化了!

Spring配置

图6 别名的配置

图7 bean的配置

图8 applicatonContext的import配置

依赖注入(DI)

  1. 构造器注入

    1. 前面已经写过了

  2. set方法注入(属性的注入)

    1. <bean id="address" class="com.cqh.model.Address"></bean>
      <bean id="student" class="com.cqh.model.Student">
          <!--        第一种注入,普通值注入 value-->
         
      <property name="name" value="cqh"></property>
          <!--        第二种注入,Bean注入 ref-->
         
      <property name="address" ref="address"></property>
          <!--第三种注入 数组注入 -->
         
      <property name="books">
              <array>
                  <value>1</value>
                  <value>2</value>
                  <value>3</value>
                  <value>4</value>
              </array>
          </property>
          <!--    List-->
         
      <property name="hobbies">
              <list>
                  <value>a</value>
                  <value>b</value>
                  <value>c</value>
                  <value>d</value>
              </list>
          </property>
          <!--        set-->
         
      <property name="games">
              <set>
                  <value>xx</value>
                  <value>xx</value>
                  <value>xx</value>
                  <value>Xx</value>
              </set>
          </property>
          <!--Map-->
         
      <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>
          <!--properties-->
         
      <property name="info">
              <props>
                  <prop key="1">432</prop>
                  <prop key="2">432</prop>
                  <prop key="3">432</prop>
                  <prop key="4">432</prop>
              </props>
          </property>
          <!--boolean-->
         
      <property name="wife" value="false"></property>
      </bean>

  3. 拓展方式注入

p命名 c命名空间来注入

p空间就是property

c空间就是construct-args

图9 用P命名空间、C命名空间进行注入

注意:注入需要导入相应xml约束

bean的作用域:

图10 bean的作用域

图11 作用域详解

2020/6/1

Bean的自动装配

自动装配是Spring满足bean依赖一种方式

Spring会在上下文中自动寻找,并自动给Bean装配属性

在Spring中有三种装配方式

  1. 在xml中显式的配置

  2. 在java中显式配置

  3. 隐式的自动装配bean

ByName自动装配 会自动在容器上下文查找和自己对象setXXX()方法后面的值对应的beanId

图12 在bean配置autowire自动装配

ByType装配

图13 byType自动配置

小结:

byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性set方法的值一致

byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的set方法的值一致

使用注解自动装配

  1. 导入约束  context

  2. 配置注解的支持

<context:annotation-config/>

@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的底层

代理模式的分类

  1. 静态分类

  2. 动态代理 

图20 代理模式化成现实图

静态代理

角色分析

  1. 抽象角色:一般使用接口或者抽象类来解决  要做的事

  2. 真实角色:被代理的角色    例如房东

  3. 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作  例如中介

  4. 客户:访问代理对象的人

2020/6/3

静态代理

代码步骤

  1. 接口(业务接口)

图21 接口(要做的事 业务接口)

  1. 真实角色(业务实现类)

图22 真实角色(业务实现类)

  1. 代理角色

图23 代理

  1. 客户端访问代理角色

图24 客户

静态代理模式的好处:

  1. 可以让真实角色操作更加纯粹 不用去关注一些公共的业务

  2. 公共页就交给代理角色 实现了业务的分工

  3. 公共业务发生拓展的时候,方便集中管理

缺点

  1. 一个真实角色就会产生一个代理角色;代码量会翻倍~开发效率会变低

AOP图解

图25 AOP图解

动态代理

  1. 动态代理和静态代理角色一样

  2. 动态代理的代理类是动态生成的,不是我们直接写好的

  3. 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    1. 基于接口---jdk动态代理  【学习】

    2. 基于类:cglib

    3. java字节码实现:javasist

需要了解两个类:Proxy:代理,InvocationHandler:调用处理程序

动态代理比静态代理还多的好处:

  1. 一个动态代理类代理的是一个接口类,而不是静态代理中一个接口类中的一个方法,一般就是对应的一类业务

  2. 一个动态代理类可以代理多个实现类,只要是实现了同一个接口即可!

 

2020/6/4

使用Spring实现AOP

图26 首先需要导入AOP依赖包

方式一:使用Spring的API接口【主要SpringAPI接口实现】

图27 通过advice-ref关联需要拓展的方法,通过pointcut来注入

图28 将方法的类注入Spring

 

方法二:自定义来实现AOP【主要是切面定义】

图29 通过自定义类来注入

图30 自定义类

方式三:使用注解实现

图31 注解实现方式 直接写在类上

图32 applicationContext的配置 需要加入<aop:aspectj-autoproxy>开启注解支持

 

整合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。

第一种方式

  1. 编写数据源配置

  2. sqlSessionFactory

  3. sqlSessionTemplate

  4. 给接口加实现类

  5. 将自己写的实现类,注入到Spring中

  6. 测试使用即可

 

 

第二种实现方式和第一种不一样的就是

省略sqlsessionTemplate 继承SqlSessionDaoSupport 

在Moudle spring10-mybatis

 

 

声明式事务

  1. 回顾事务

    1. 把一组业务当成一个业务来做,要么都成功,要么都失败

    2. 事务写在项目开发中,十分重要,设计到数据一致性的问题

    3. 确保完整性和一致性

  2. 事务的ACID原则

    1. 原子性

    2. 一致性

    3. 隔离性

      1. 多个业务可能操作同一个资源,防止数据损坏

    4. 持久性

      1. 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,会被持久化的写到存储器中

2020/6/5

Spring中的事务管理

  1. 声明式事务:AOP

  2. 编程式事务:需要在代码中进行事务 用try catch来包裹代码 最后用rollback回滚(代码实现)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值