Spring

  • 下载地址

  • 优点

    • 开源的免费框架/容器
    • 轻量级、非入侵式的框架
    • 控制反转IOC 面向切面编程AOP
    • 支持事务的处理,对框架整合的支持
  • 组件

  • 拓展

IOC

IOC理论推导

  • 背景
    在之前业务中,用户需求(new对象)可能会影响原来的代码,我们需要根据用户的需求去修改源代码。
  • 问题的解决方案
    使用一个set接口实现,把控制权交到程序员手上(程序不再具有主动性:创建对象,而是变成了被动的接受对象)
    IOC的原型:程序员不用再去管理对象的创建,大大降低系统的耦合性,从而能够更专注于业务实现

    1. private UserDao userDao;
    2. //利用set进行动态实现值的注入
    3. public void setUserDao(UserDao userDao){
    4. this.userDao = userDao;
    5. }
    6. public void getUser() {
    7. userDao.getUser();
    8. }

IOC的实质

  • 控制反转IOC,是一种设计思想,依赖注入DI是实现IOC的一种方法。没有IOC程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
  • 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体:Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
  • 控制反转:一种通过描述(XML / 注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,其实现方法是DI

HelloSpring

  • pojo层的Hello实体
  • beans.xml
  • Mytest

思考问题

  • Hello对象是谁创建的?
    hello对象是由Spring创建的

  • Hello对象的属性是怎么设置的?
    hello对象的属性是由Spring容器(即:beans)设置的

总结

  • 反转:程序本身不创建对象,而是变成被动的接受对象
    依赖注入:利用set方法来进行注入的

  • 直到现在,我们彻底不用在小程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改。所谓的IOC,一句话搞定:对象由spring来创建、管理、装配。

IOC创建对象方式

  • 无参构造

  • 三种有参构造

    • 第三种!参数名
  • 总结
    在配置文件加载时,容器中管理的对象就已经初始化了。

Spring的配置

别名

  1. <!-- 别名,如果添加了别名,我们也可以使用别名来获取这个对象-->
  2. <alias name="user" alias="userNew"/>

Bean

  1. <!--
  2. id: bean的唯一标识符,也就是相当于 对象名
  3. class bean对象所对应的全限定名:包名 + 类型
  4. name:别名,更高级,能同时起多个别名
  5. -->
  6. <bean id="userT" class="com.kuang.pojo.UserT" name="user2,u2">
  7. <property name="name" value="c110"/>
  8. </bean>

import

  • applicationContext.xml

依赖注入

构造器注入

Set方式注入!

  • 依赖注入:set注入

    • 依赖
    • 注入
  • 环境搭建

    • 复杂类型
  • 真实测试对象
  • beans.xml

    • 普通注入:value

    • Bean注入:ref

    • 数组注入

    • List注入

    • Map注入


  • 测试类

拓展方式注入

c命名 p命名 空间注入

  • p命名空间的注入:可以直接注入属性的值:property

    • 依赖第三方的约束
  • c命名空间的注入:通过构造器注入:constructor-args

    • 依赖第三方约束

Bean

Bean的作用域

  • 单例singleton:spring默认

  • 原型模式prototype:每次从容器中get时,都会产生一个新对象

  • 其余的request session application 只能在web开发中使用到

自动装配Bean

  • 自动装配:Spring满足bean依赖的一种方式(Spring会在上下文中自动查找,并给bean装配属性)

  • 三种装配方式

    • xml中显示
    • Java中显示
    • 隐式的自动装配bean!!

      ByName自动装配

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

      ByType自动装配

    • 需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

注解实现自动装配

  • 常用依赖

  • 开启约束

  • @Autowired

    • @Autowired (required = false)
      如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空

    • @Autowired
      @Qualifier(value=”dog222”):如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value=”xxx”)去配置@Autowired的使用,指定一个唯一的bean对象注入

  • @Nullable

  • @Resource
    先名字查找,再按类型查找

    • @Resource(name=”cat2”)

小结

Spring注解开发

在spring4之后,要使用注解开发,必须保证aop的包导入了。使用注解需要导入 context约束,增加注解的支持。

  • @Component 组件:等价于

    • 放在类上,说明这个类被Spring管理了,就是bean!
    • @Value(“kuangshen”):属性注入

      • 相当于
    • @Component 的三个衍生注解 —— 在web开发中,会按照MVC三层架构分层( 将某个类注册到Spring,装配Bean


  • bean

  • 属性如何注入

  • 衍生的注解

  • 自动装配置

  • 作用域

  • 小结

使用JavaConfig实现配置

  • 完全不使用Spring的xml配置,全权交给Java来做
    JavaConfig是Spring的一个子项目

  • User: 要加载到Spring里的类

    • @Component:说明这个类被Spring托管了,注册到容器中。
    • @Value(“QINJIANG”) 属性被注入值
  • KuangConfig

    • @Configuration :这个也会被SP让那个容器托管,注册到容器中。(因为他本来就是一个@Component)

      • 代表一个配置类,跟之前看的beans.xml一样

        • @ComponentScan(“com.kuang.pojo”)
    • @Bean:相当于之前写的一个bean标签

      • 这个方法的名字,就相当于bean标签中的id属性
      • 这个方法的返回值,就相当于bean标签中的class属性
  • 测试类MyTest


  • 有两个bean.xml的情况该怎么操作

    • @Import(KuangConfig.class):@Import除了可以把普通的类定义为Bean,@Import还可以引入一个@Configuration修饰的类(引入配置类),从而把让配置类生效(配置类下的所有Bean添加到IOC容器里面去)。在自定义starter的时候经常会用到。

代理模式

  • 代理模式 是 SpringAOP的底层

  • 代理模式的分类

    • 静态代理

      • 角色分析

        • 抽象角色:一般会使用接口 或 抽象类 来解决

        • 真实角色:被代理的角色

        • 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作

          • 附属操作:中介存在的意义
        • 客户:访问代理对象的人

          • 代理前

          • 代理后

      • 静态代理再理解:不改变原来的代码的前提下,修改代码

    • 动态代理

      • 角色:动态代理和静态代理一样

        • 不同:动态代理的代理类是动态生成的,不是我们直接写好
      • 分类

        • 基于接口的动态代理

          • JDK动态代理
        • 基于类的动态代理

          • cglib
          • javassist:Java字节码实现
    • 代理模式的好处 / 缺点

AOP

什么是AOP

AOP在Spring中的作用

提供声明式服务,允许用户自定义切面

  • 横切关注点:与业务逻辑无关,但我们需要关注的部分:日志、安全、缓存、事务等

  • 切面ASPECT:一个类Log —— 横切关注点 被模块化 的特殊对象

  • 通知Advice:类Log中的一个方法 —— 切面要完成的工作

    • Spring支持5中类型的Advice
  • 目标Target:一个接口/方法 —— 被通知的对象

  • 代理Proxy:想目标对象应用通知之后创建的对象

  • 切入点PointCut:切面通知执行的“地点“的定义 如:method.invoke()

  • 连接点JointPoint:与切入点匹配的执行点

使用Spring实现AOP

导入依赖

UserService

UserServiceImpl

方式一:使用原生Spring API接口

Log

AfterLog

把类注册到Spring中:Spring API

  • applicationContext.xml

    • 加上约束
    • ****:public 返回值 类名 方法名 参数
  • MyTest

方式二:自定义来实现AOP(主要是切面定义)

  • 优点
    切入点可以复用、可以有多个不同的切入点

DiyPointCut

applicationContext.xml

方式三:注解实现AOP

  • applicationContext.xml

    • 也可以直接 在AnnotationPointCut 类上 @Component

整合Mybatis

  • 导入依赖

    • Junit
    • mysql数据库
    • mybatis
    • spring相关的
    • aop织入
    • mybatis-spring
  • 配置文件

  • 测试

  • mybatis-config.xml

  • UserMapper.xml

    -

  • Mytest

  • pom

整合mybatis方式一

  • 导入依赖

  • DataSource SQLSessionFactory

    • 后来是放在applicationContext.xml中,这样这里就单纯操作数据库
  • UserMapperImpl

  • applicationContext.xml

  • Mytest


总结:

整合mybatis方式二

  • 直接继承SqlSessionDaoSupport

  • User实体类

  • UserMapper接口:取数据

  • UserMapper.xml

  • spring-dao.xml:配置mybatis

  • UserMapperImpl.xml
    直接继承SqlSessionDaoSupport

  • applicationContext.xml:把实现类注入Spring容器

  • MyTest

Spring声明事务

  • 引子

一个使用Mybatis-Spring的原因:它允许mybatis参与到spring的事务管理中,而不是给mybatis创建一个新的专用事务管理器,mybatis-spring借助了spring中的DataSourceTransactionManager来实现事务管理。

  • 标准配置
    开启Spring的事务处理功能:在Spring的配置文件中创建一个 DataSourceTransactionManager对象。

  • 交由容器管理事务——结合AOP实现事务的织入
    执行增删改查的时候自动丢事务