Spring学习《狂神说Java》 笔记

2020/5/28

Spring

简介

Spring学习《狂神说Java》 笔记

优点

Spring是一个开源的免费的框架!

Spring是一个轻量级的、非入侵式的框架!

控制反转IOC,面向切面编程AOP

支持事务的处理,对框架整合的支持

总结一句话:Spring是一个轻量级的控制反转(IOC)和面向切面的(AOP)的框架

拓展

Spring学习《狂神说Java》 笔记

弊端:Spring发展了太久之后,配置太过繁杂。配置文件里面的东西很难理解

IOC引导

Spring学习《狂神说Java》 笔记

利用这个set方法就可以从自己new变成客户new

 

Spring学习《狂神说Java》 笔记

IOC本质:获得依赖对象的方式反转了,控制反转是一种通过(xml或者注解)并通过第三方生成或获取特定对象的方式,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)

Spring学习《狂神说Java》 笔记

 

Spring学习《狂神说Java》 笔记

这些实体类通过类中的无参构造注入 如果类中没有无参构造记得添加 否则在Spring中会注入失败

2020/5/29

要实现不同的操作,只需要在xml配置文件中进行修改,所谓的ioc:对象由Spring来创建,管理、装配

IOC创建对象的方式   是在xml中配置bean注入

  1. 使用无参构造创建对象,默认方法
  2. 假设我们要使用有参构造创建对象。
    1. Spring学习《狂神说Java》 笔记

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

Spring配置

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

依赖注入(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

    1. Spring学习《狂神说Java》 笔记

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

bean的作用域:

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

2020/6/1

Bean的自动装配

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

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

在Spring中有三种装配方式

  1. 在xml中显式的配置
  2. 在java中显式配置
  3. 隐式的自动装配bean

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

Spring学习《狂神说Java》 笔记

ByType装配

Spring学习《狂神说Java》 笔记

小结:

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

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

使用注解自动装配

  1. 导入约束  context
  2. 配置注解的支持

<context:annotation-config/>

@Autowired

直接在属性上使用即可,也可以在set方法上使用

使用autowird后可以不用编写set方法了,前提是你这个自动装配的属性在IOC(Spring)容器

Spring学习《狂神说Java》 笔记

原理实现:通过反射机制来实现访问,所以不需要写set方法

可以配合@qualifier来指定一个唯一的bean对象注入

@Nullable 如果某个字段标记了这个注解后,说明这个字段可以为null

@Autowired 里面有个参数required可以为false,说明这个字段可以为null,否则不允许为空

@Resource注解 也可以实现和@autowired一样的功能

注意:@Resource注解是Java自带的注解

使用注解开发     

注解说明

@Component:组件,放在类上,说明这个类被Spring管理了就是Bean

衍生的注解

dao层     @Repository

service层  @Service

controller层  @Controller

@Value 可以用来注入属性   可以在setXXX()方法上直接注入值

Spring学习《狂神说Java》 笔记

@Scope 作用域注解 里面可以有prototype和singleton

xml与注解:

xml更加万能,适用于任何场合!

注解 不是自己的类使用不了 维护相对复杂

xml与注解最佳实践

1.xml用来管理bean

2.注解只负责完成属性的注入

3.在使用的过程,想让注解生效,必须开启对注解的支持

Spring学习《狂神说Java》 笔记

2020/6/2

Java类实现Spring配置

Spring学习《狂神说Java》 笔记

现在完全可以做到不适用Spring的xml配置了,全权交给Java来做。

JavaConfig是Spring的一个子项目,在Spring4后,它成为了一个核心功能

 

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

这种纯Java的配置方式,在SpringBoot中随处可见

SpringAOP

代理模式 这是SpringAOP的底层

代理模式的分类

  1. 静态分类
  2. 动态代理 

Spring学习《狂神说Java》 笔记

静态代理

角色分析

  1. 抽象角色:一般使用接口或者抽象类来解决  要做的事
  2. 真实角色:被代理的角色    例如房东
  3. 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作  例如中介
  4. 客户:访问代理对象的人

2020/6/3

静态代理

代码步骤

  1. 接口

Spring学习《狂神说Java》 笔记

  1. 真实角色

Spring学习《狂神说Java》 笔记

  1. 代理角色

Spring学习《狂神说Java》 笔记

  1. 客户端访问代理角色

Spring学习《狂神说Java》 笔记

 

静态代理模式的好处:

  1. 可以让真实角色操作更加纯粹 不用去关注一些公共的业务
  2. 公共页就交给代理角色!实现了业务的分工
  3. 公共业务发生拓展的时候,方便集中管理

缺点

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

AOP图解

Spring学习《狂神说Java》 笔记

动态代理

  1. 动态代理和静态代理角色一样
  2. 动态代理的代理类是动态生成的,不是我们直接写好的
  3. 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
    1. 基于接口---jdk动态代理  【学习】
    2. 基于类:cglib
    3. java字节码实现:javasist

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

 

 

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

  1. 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  2. 一个动态代理类可以代理多个类,只要是实现了同一个接口即可!

什么是AOP

使用Spring实现AOP

Spring学习《狂神说Java》 笔记

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

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

方式三:使用注解实现

2020/6/4

什么是AOP

使用Spring实现AOP

Spring学习《狂神说Java》 笔记

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

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

 

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

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

方式三:使用注解实现

Spring学习《狂神说Java》 笔记

Spring学习《狂神说Java》 笔记

整合MyBatis

mapper中的类 要么和在resource中的mapper.xml对应 包名什么都一致

如果不按照mybatis规则 就在maven中加入这个过滤  否则按照mybatis的规则,maven不会扫描到mapper.xml

Spring学习《狂神说Java》 笔记

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

学到p26