Spring三大核心思想详解

2023-10-29

spring核心思想分三大类:控制反转(IOC),依赖注入(DI)和面向切面(AOP)

  • 控制反转

通俗讲,控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。也就是说,正常我们都是新建对象,才可以调用对象。现在不需要了,交给容器来管理,我们只需要通过一些配置来完成把实体类交给容器这么个过程。这样可以减少代码量,简化开发的复杂度和耦合度。
这里,我要解释下几个概念:
1.控制反转只是一个概念,我理解为一种设计模式。
2.控制反转的主要形式有两种:依赖查找依赖注入
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)。

  • 依赖注入

上面也解释了这个概念,其实现方式有三种:属性注入(setter注入),构造器注入和自动装配。

方式一、属性注入

package com.spring.demo02.entity;  
public class Programmer {  
  
    private String name;  
    private String sex;  
  
    // 在这里定义要依赖的computer属性,加上set方法  
    private Computer computer;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    public Computer getComputer() {  
        return computer;  
    }  
  
    /** 
     * 加上Setter方法 
     * */  
    public void setComputer(Computer computer) {  
        this.computer = computer;  
    }  
} 
package com.spring.demo02.entity;  
public class Computer {  
      
    private String brand;  
    private String color;  
    private String size;  
      
    public void coding() {  
        System.out.println("Computer is coding!!!");  
    }  
  
    public String getBrand() {  
        return brand;  
    }  
  
    public void setBrand(String brand) {  
        this.brand = brand;  
    }  
  
    public String getColor() {  
        return color;  
    }  
  
    public void setColor(String color) {  
        this.color = color;  
    }  
  
    public String getSize() {  
        return size;  
    }  
  
    public void setSize(String size) {  
        this.size = size;  
    }    
}

看上面的代码,可以发现,Programmer类里面,有3个属性,name,sex,computer,并且都有对应的getter、setter方法;Computer类里面也有三个属性,分别是品牌、颜色、尺寸,也都有对应的getter、setter方法。这只是第一步,在类里面声明属性并且实现set方法。

接下来,要写一个spring的xml配置文件,如下:

<?xml version="1.0" encoding="UTF-8"?>  
  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
      
  <bean id="programmer" class="com.spring.demo2.entity.Programmer">  
    <property name="name" value="小李"></property>  
    <property name="sex" value="男"></property>  
    <property name="computer" ref="computer"></property>  
  </bean>  
    
  <bean id="computer" class="com.spring.demo2.entity.Computer">  
    <property name="brand" value="hp"></property>  
    <property name="color" value="黑"></property>  
    <property name="size" value="14"></property>  
  </bean>  
    
</beans>

解读一下这个xml文件:
1.声明一个bean,可以理解为实例化了一个对象。那这里实例化了两个对象(programmer和computer),各个属性都已经赋值上去。

2.id为programmer的bean,其实就是Programmer类;通过给property赋值,Spring就会通过Programmer类的各个属性的set方法,逐一给Programmer的属性赋值。

3.在programmer里面,有一个属性是computer的,可以看到它属性值是 ref="computer",这就说明computer这个属性是个引用,这里ref后面的值其实就是指向另一个bean的id值,所以这里引用的是id为computer的bean。

以上,就是属性注入了。关键的是在类里面声明属性,写set方法,然后在xml里面配置bean和property的值。

方式二、构造器注入
构造器注入,顾名思义,就是在构造器里面注入依赖对象。那是怎么实现的呢?其实跟属性注入差不多,定义一个有参构造器,然后配置xml文件就行了。看代码:

package com.spring.demo03.entity;  
  
import com.spring.demo02.entity.Computer;  
  
public class Programmer {  
      
    private Computer computer;  
      
    public Programmer(Computer computer){  
        this.computer = computer;  
    }  
}
package com.spring.demo03.entity;  
  
public class Computer {  
  
    private String brand;  
    private String color;  
    private String size;  
  
    public Computer(String brand, String color, String size) {  
        this.brand = brand;  
        this.color = color;  
        this.size = size;  
    }  
} 

 上面两个类都有一个有参的构造器,接下来,在xml里面配置这两个bean,然后再配置构造器的参数值就可以了

<?xml version="1.0" encoding="UTF-8"?>  
  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
      
  <bean id="programmer" class="com.spring.demo3.entity.Programmer">  
    <constructor-arg ref="computer"></constructor-arg>  
  </bean>  
    
  <!-- 构造器里面没有name字段,只有value,是根据构造器的方法参数顺序来定义的 -->  
  <bean id="computer" class="com.spring.demo3.entity.Computer">  
    <constructor-arg value="联想"></constructor-arg>  
    <constructor-arg value="红色"></constructor-arg>  
    <constructor-arg value="15.6寸"></constructor-arg>  
  </bean>  
    
</beans> 

方式三:自动装配

package com.spring.demo04.entity;  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
  
@Component  
public class Programmer {  
      
    @Autowired  
    Computer computer;  
  
}  
package com.spring.demo04.entity;  
  
import org.springframework.stereotype.Component;  
  
@Component  
public class Computer {  
    private String brand;  
    private String color;  
    private String size;
 
    public String getBrand() {  
        return brand;  
    }  
  
    public void setBrand(String brand) {  
        this.brand = brand;  
    }  
  
    public String getColor() {  
        return color;  
    }  
  
    public void setColor(String color) {  
        this.color = color;  
    }  
  
    public String getSize() {  
        return size;  
    }  
  
    public void setSize(String size) {  
        this.size = size;  
    }  
}
<?xml version="1.0" encoding="UTF-8"?>  
  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/context   
    http://www.springframework.org/schema/context/spring-context-3.0.xsd   
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
      
    <context:component-scan base-pakage="com.spring.demo04">  
    
</beans>

关键点:在类前面加注解:@Component,在需要注入的类里面加注解:@Autowired,这样xml里面的自动扫描就会扫描到这些加了注解的类和属性,在实例化bean的时候,Spring容器会把加了@Component的类实例化;在实际运行时,会给加了@Autowired的属性注入对应的实例。@Autowired方式是通过反射来设置属性值的,具体参考:https://blog.csdn.net/wenluoxicheng/article/details/73608657

  • 面向切面

面向切面是一个概念,通常用来为许多其他的类提供相同的服务,而且是固定的服务,是独立的。提升了代码的复用性,减少了代码的耦合度,减轻程序员的工作负担,把程序的重心放在了核心的逻辑上。
它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
应用场景有日志记录,性能统计,安全控制,事务处理,异常处理等。

参考:
百度百科
https://blog.csdn.net/zhaoraolin/article/details/78941062

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring三大核心思想详解 的相关文章

随机推荐

  • 【系统架构】什么是集群?为什么要使用集群架构?

    什么是集群 为什么要使用集群架构 1 什么是集群 2 为什么要使用集群 2 1 高性能 2 2 价格有效性 2 3 可伸缩性 2 4 高可用性 2 5 透明性 2 6 可管理性 2 7 可编程性 3 集群的常见分类 3 1 负载均衡集群 3
  • 提速科研,AI 正引领一场新革命

    By 超神经 内容一览 五一国际劳动节假期 HyperAI超神经为大家汇总了往期 ScienceAI 相关报道 对该领域感兴趣的读者可以来一探究竟了 关键词 ScienceAI 盘点 整理 缓缓 作为近两年的技术热点 ScienceAI 在
  • mysql实现if语句判断功能的六种使用形式

    文章目录 前言 一 ifnull函数 二 nullif函数 三 if函数 四 if语句 多用于存储过程 五 if else语句 多用于存储过程 六 if elseif else语句 多用于存储过程 总结 前言 在Mysql数据库中实现判断功
  • 2023-6-1第三十二天

    reserved矜持的 预定的 专用的 reserve预定 保留 储备 discard丢弃 抛弃 ensemble整体 全体 assemble集合 收集 组装 tutorial教程 辅导材料 convention习俗 惯例 distract
  • Git cherry-pick 指令总结

    使用场景 在某些开发中 可能会有多个分支 比如 你负责的项目在生成环境出现一个致命Bug 公司项目管理领导需要你立即解决修复 并且针对本次修改拉取了一个临时分支 dev 20221109 分支 但你在解决问题时没有及时把自己本地分支由dev
  • mysql使用存储过程将一个表中的数据导入另一个表

    存储过程 本人也是第一次使用存储过程 中间遇到了很多坑 在此记录一下 希望能帮助使用的人少踩点坑 先说一下我使用存储过程的需要 其实需求很简单就是把一个表中的数据导入一个新的表中 并且删除原有表中的数据 说白了就是一个数据的备份 我是使用n
  • Python实现Excel办公自动化之openpyxl

    目录 Excel安装库的对比 安装 基本操作 1 引入库 2 工作簿 创建或者加载工作簿 获取当前工作表 3 工作表 创建工作表和获取工作表 获取所有工作表 删除工作表 复制工作表 过滤和排序 使用公式 4 单元格 访问单元格 合并单元格
  • Django资料之ORM查询操作

    条件查询 models User objects filter id 1 name root 等于 models User objects filter id gt 1 name root 大于 models User objects fi
  • xilinx ip 高斯滤波

    功能 1 单axi stream 接口输入 10bit raw输入 axis输出 10bit输出 使用5x5 的卷积进行滤波 2 使用xilinx hls 编写 3 配置寄存器有 pragma HLS INTERFACE s axilite
  • Spring学习笔记:AOP

    学习内容 AOP 文章目录 学习内容 AOP 一 什么是AOP 二 AOP中的相关概念 三 使用Spring实现AOP 1 使用原生Spring API接口 2 自定义类来实现AOP 3 使用注解实现 四 AOP中的五类通知 一 什么是AO
  • PCL 1.13.0——中文显示乱码解决办法

    目录 一 问题概述 二 解决方法 一 问题概述 PCL1 13 0中使用的是VTK9 2进行点云的可视化 在使用中发现PCL1 13 0中的setWindowName 进行中文名称显示的时候会出现乱码现象 如下所示 可视化投影结果 boos
  • 特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)

    目录 1 对阵矩阵 2 三角矩阵 3 三对角矩阵 带状矩阵 均假设数组的下标从0开始 1 对阵矩阵 定义 若对一个n阶矩阵A中的任意一个元素 a 都有a a 1 i j n 则称其为对称矩阵 存储策略 只存储主对角线 下三角区 或主对角线
  • shardingsphere的坑。。。

    前面有说到defaultDataSource设置不生效 手动修改后 此项还勉强能用 如今又遇到一个奇葩的问题 本地调试时一切正常 丢到服务器后就一直报错 重点是 只是说空指针 就是不说具体哪里有毛病 报错信息如下 Creating a ne
  • 数据库连接用法

    1 内联接 典型的联接运算 使用像 或 lt gt 之类的比较运算符 包括相等联接和自然联接 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行 例如 检索 students和courses表中学生标识号相同的所有行 2 外联接 外
  • Java编程工具哪种好?

    Java强大的功能需要依托在软件工具上实现 所以Java编程开发需要用到编程工具 市面上有哪些Java编程工具呢 那种编程工具好呢 该怎么选择呢 接下来罗列了一系列的Java编程开发工具 一 idea 这是jetbrains公司的产品 也是
  • 从0实现基于Linux socket聊天室-多线程服务器模型-1

    前言 Socket在实际系统程序开发当中 应用非常广泛 也非常重要 实际应用中服务器经常需要支持多个客户端连接 实现高并发服务器模型显得尤为重要 高并发服务器从简单的循环服务器模型处理少量网络并发请求 演进到解决C10K C10M问题的高并
  • linux下gcc/g++编译器使用

    linux编译器gcc g 使用 1 gcc 编译器编译c语言程序 gcc 文件名 默认生成a out 可执行程序程序 我们执行a out由两种方法 相对路径 绝对路径 进行程序的翻译 1 预处理 进行宏替换 头文件展开 去注释 条件编译
  • kettle开发篇-流查询-Day25

    前言 昨天我们讲了数据库相关操作 数据库连接来实现两个库的跨库查询 对应复杂的跨库查询通过数据库连接整合到一块后 就像是在一个数据库里面操作 今天我们来学习流查询 流查询主要用于在查询前把数据加载到内存中 并且只能进行等值查询 一 流查询
  • 51单片机波特率计算c语言,51单片机波特率怎么算?51单片机波特率计算公式

    51单片机波特率怎么算 51单片机波特率计算公式 方式0 方式0的波特率固定为主振频率的1 12 方式2 方式2的波特率由PCON中的选择位SMOD来决定 可由下式表示 波特率 2的SMOD次方除以64再乘一个fosc 也就是当SMOD 1
  • Spring三大核心思想详解

    spring核心思想分三大类 控制反转 IOC 依赖注入 DI 和面向切面 AOP 控制反转 通俗讲 控制权由应用代码中转到了外部容器 控制权的转移 是所谓反转 也就是说 正常我们都是新建对象 才可以调用对象 现在不需要了 交给容器来管理