Spring————java的反射机制,Spring的IOC和DI

news2024/10/5 16:27:06

一、认识Spring

1.1、Spring家族

SpringFramework: Spring框架:是Spring中最早核心的技术,也是所有其他技术及的基础。

 SpringBoot:Spring是用来简化开发。而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。

 SpringCloud:这个是用来做分布之微服务架构的相关开发。

除了上面的这三个技术外,还有很多其他的技术,也比较流行,如SpringData,SpringSecurity等,这些都可以被应用在我们的项目里。

二、Spring框架:

在我们写代码的时候通常修改代码要经过以下步骤:

修改源码--编译--打包--部署--重启

每修改一次代码就要经过这些步骤,当项目比较大的时候重新编译甚至需要几个小时,大大的不方便,因此我们可以通过反射来解决问题。

反射的特点:可以运行时修改。

dao:数据库的增删改查

service:业务处理

servlet:前后端交互

 通过反射加载驱动:

Class.forName("  类的全类名:即包名加类名 ")

通过Class类加载获得类的Class加载器。

功能:类的加载器可以获得类中的东西,相当于解剖的手术刀

即:属性(存储数据),构造方法(创建对象),功能方法(完成功能)

1.获取类中的属性:

 getFields()//获取所有公开的成员变量,包括继承变量
 getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量

2.获取类中的构造方法

getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有

 3.获取类中的功能方法

getMethods()//获取所有可见的方法,包括继承的方法
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法

三,IOC/DI

IOC控制反转:

(1)什么是控制反转呢?

使用对象时,由主动new产生对象转换为由==外部=提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转

  • 业务层要用数据层的类对象,以前是自己new的
  • 现在自己不new了,交给别人[外部]来创建对象
  • 别人[外部]就反转控制了数据层对象的创建权

那么,别人[外部]指定是什么呢? 

(2)Spring和IOC之间的关系是什么呢?

  • Spring技术对IOC思想进行了实现
  • Spring提供了一个容器,称为==lOC容器==,用来充当IOC思想中的“外部”
  • IOC思想中的别人[外部]指的就是Spring的IOC容器

(3)IOC容器的作用以及内部存放的是什么?

  •  IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象
  • 被创建或被管理的对象在IOC容器中统称为==Bean==
  • IOC容器中放的就是一个个的Bean对象

(4)当I0C容器中创建好service和dao对象后,程序能正确执行么? 

  • 不行,因为service运行需要依赖dao对象
  • IOC容器中虽然有service和dao对象,但是service对象和dao对象没有任何关系,需要把dao对象交给service也就是说要绑定service和dao对象之间的关系,像这种在容器中建立对象与对象之间的绑定关系就要用到DI:

通俗的讲:IOC:控制反转,以前依赖的对象自己直接new,现在不需要new,框架会自动注入对象,创建对象的权利转移给了框架;

DI:依赖注入。

(1)什么是依赖注入呢?

业务层要用数据层的类对象,以前是自己new的,现在自己不new了,靠别人[外部其实指的就是IOC容器]来给注入进来。这种思想就是依赖注入

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

(2)IOC容器中哪些bean之间要建立依赖关系呢?

这个需要程序员根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系

通俗的讲:一个BookService类的功能需要依赖另外一个BookDao类配合,同时需要赋上一 个具体的对象,则成这种关系是依赖注入;

具体使用: 

1.创建项目,导入springjar

2.按照如下目录结构创建接口及其实现类,做好准备工作

 servlet

public class BookServlet {
    BookService bookService;

    @Test
    public void add(){
        System.out.println("BookServlet...add");

        //1.获得IOC容器
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
        //2.根据名字从容器中获取对象
         bookService = (BookService) context.getBean("bookService");
         bookService.save();
    }
}

 service

接口:

public interface BookService {
    void save();
}

实现类:

public class BookServiceImpl implements BookService {

    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("BookServiceImpl...save");
        bookDao.insert();
    }
}
dao
接口:
public interface BookDao {
    public void insert();
}

实现类:


public class BookDaoImpl implements BookDao {
    @Override
    public void insert() {
        System.out.println("BookDaoImpl......insert");
    }
}

注意:此时项目没法执行,因为没有做依赖对象的注入。

3.使用spring完成IOC的配置和DI依赖注入  

创建 spring 的核心配置文件
?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.xsd">
<!--把所有对象创建到spring的IOC容器中,并起上名字
id:表示给对象起名字
class:类的全类名
-->
<bean id="bookDao" class="com.chen.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.chen.service.impl.BookServiceImpl">
<!--spring的依赖注入:property表示BookServiceImpl的属性,常规属性使用value赋值,
类型属性使用ref引用-->
<property name="name" value="张三"/>
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
bean 标签表示把对应 class 的对象创建到 IOC 容器中,如果当前对象有依赖的其他对象,那么可以 通过property 对依赖的对象使用 ref 引用容器中已经注册过的对象。

注意:BookServiceImpl需要给bookDao属性设置setter方法,框架才能自动注入 

对于基本数据类型(包括String),指定属性值使用"value"属性,而对于引用类型使用"ref"属性。

public class BookServiceImpl implements BookService {

    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("BookServiceImpl...save");
        bookDao.insert();
    }
}

构造器注入: 

  1. 使用constructor-arg标签进行依赖注入。name属性要与实现类中提供的形参类型和个数一致,否则将会报错。ref属性指向的是spring的IOC容器中其他bean对象
  2. 在BookServiceImpl中定义引用类型属性,提供有参的构造方法

servlet 中进行测试
1. 首先获取 IOC 的容器;
2. 从容器中获取 bookService 对象;
3. 执行方法: servlet 执行 ---service 执行,由于 spring 完成了依赖注入 ------dao 层执行
public class BookServlet {
    BookService bookService;

    @Test
    public void add(){
        System.out.println("BookServlet...add");

        //1.获得IOC容器
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
        //2.根据名字从容器中获取对象
         bookService = (BookService) context.getBean("bookService");
         bookService.save();
    }
}

集合注入:常见的集合类型有哪些?

  • 数组
  • List
  • set
  • Map

再重新创建一个BookService的接口实现类BookServiceVip

使用相应标签(list、set、array、map...)对属性值进行注入

<property name="list">
            <list>
                <value>张三</value>
                <value>小明</value>
                <value>小美</value>
            </list>
        </property>
<property name="set">
          <set>
              <value>南阳</value>
              <value>洛阳</value>
              <value>安阳</value>
          </set>
        </property>
<property name="map">
            <map>
                <entry key="sex" value="男"></entry>
                <entry key="age" value="19"></entry>
                <entry key="phone" value="110"></entry>
            </map>
        </property>

注解:

在BookDaoimpl上添加@Component注解

 注:@Component注解不可以添加在接口上,因为接口是无法创建对象的

 配置Spring的注解包扫描

为了让Spring框架能够扫描到写在类上的注解,需要在配置文件上进行包扫面

@component:组件,Spring将管理的bean视作自己的一个组件scan:扫描

base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解

包路径越多[如:comshidaoimpl],扫描的范围越小速度越快

@Autowired:自动注入属性。自动注入优先按照类型注入,如果有多个对象,按照名字进行注入

 之前是根据名字从容器中获取对象

  注解是根据类型获得对象,前提是类型有唯一对象

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS 任务相关 API 函数(一)

文章目录一、任务创建和删除 API 函数1. xTaxkCreate()2. xTaskCreateStatic()3. xTaskCreateRestricted()4. vTaskDelete()二、任务创建和删除实验(动态方法)三、任务创建和删除实验(静态方法)一、任务创建和删除 API 函数 FreeRTOS 最基本的功能就是任务管理&#xff0c;而任…

AcWing4957.飞机降落——学习笔记

目录 题目 代码 AC结果 思路 〇、例子 一、获取数据 二、深度优先遍历&#xff08;DFS&#xff09; 1.入参 2.出口 3.判断是否找到安全降落方案 4.递推过程 5.回溯过程 6.DFS完整代码 三、输出打印 题目 4957. 飞机降落 - AcWing题库https://www.acwing.com/pr…

打开 plist 文件

​ 对于使用苹果的进阶或资深玩家来说&#xff0c;有时候要编辑plist文件&#xff0c;比如要弄两个qq&#xff0c;要修改info.plist下的sku&#xff0c;而要是没有工具&#xff0c;就不能随意查看和编辑plist文件了。再有&#xff0c;可能要通过修改plist来破解某些游戏&#x…

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…

协同数据交换平台详细设计方案(word)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 1 架构设计 1.1 总体架构协同数据交换平台利用企业服务总线、数据抽取ETL、消息中间件、大文件传输等相关技术&#xff0c;包括文件适配器、数据库适配器、Web服务中间件等在内…

【排序算法(四)】归并排序计数排序(非比较排序)以及八大排序算法的总结

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、归并排序1.1 算法…

图像处理数据集

BSDS500 Berkeley Segmentation Dataset 500 是第一个用于评估超像素算法的数据集。对于参数优化&#xff0c;使用了验证集。 500张数据集200训练集train100验证集val200测试集test 每张图像有 5 个不同的高质量地面真值分割&#xff08;groundTruth,是.mat文件&#xff09; …

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer&#xff0c;它主要用在 audioflinger 里&#xff0c;用来将多路音频源数据混音&#xff0c;以方便送进音频设备播放出来。 音频混音操作本身…

MyBatis(九)MyBatis小技巧

一、#{}和${} #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是PreparedStatement实现。可以防止sql注入&#xff0c;比较常用。 ${}&#xff1a;先进行sql语句拼接&#xff0c;然后再编译sql语句&#xff0c;底层是Statement实现。存在sql注入现象。…

第09章_异常处理

第09章_异常处理 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程1小时。但是&#xff0c;不出…

计网第五章.运输层—TCP流量控制与可靠传输

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、流量控制死锁死锁的解决&#xff1a;二、超时重传时间的选择解决方案Karn算法三、可靠传输补充&#xff1a;其实TCP的流量控制&#xff0c;可靠传输&#xff0c;拥塞控制&#xff0c;都是围绕滑动窗口机制来实现的…

SpringBoot的统一功能处理

目录 1.统一用户的的登录权限校验 最开始的用户登录 Spring拦截器 2.统一数据返回格式 统一数据的返回格式意义 统一数据返回格式的实现 3.统一异常处理 在上篇博客中我介绍了Spring AOP的基础知识,这篇博客则是AOP的实践练习,通过借助AOP实现三个目标 1.统一用户登录权…

VContainer 初体验

IOC 控制反转 IOC 提供一个对象生成容器&#xff0c;在我们需要取得某个对象时&#xff0c;不再使用New关键字进行对象生成操作&#xff0c;而是通过IOC容器内部控制来获得对象。 使用这种思想方式&#xff0c;可以让我们无需关心对象的生成方式&#xff0c;只需要告诉容器我需…

xmanager连接linux桌面教程 xmanager连接之后黑屏

xmanager 是一款专业的远程服务器管理软件&#xff0c;但习惯了使用Windows系统下的桌面&#xff0c;一时会无法适应linux服务器的命令行界面。下面我就为大家介绍xmanager连接linux桌面教程&#xff0c;xmanager连接之后黑屏的相关内容&#xff0c;让大家在使用linux更加方便。…

node.js详解

文章目录1.Node.js1.1 Node.js 模块化1.2 模块暴露数据1.2.1 模块初体验1.2.2 暴露数据1.3.导入(引入)模块1.4 JavaScript引擎1.5 什么是Node.js1.6 BFF2.包管理工具2.1 npm2.1.1 npm 的安装2.1.2 npm 基本使用2.1.2.1 初始化2.1.2.2 搜索包2.1.2.2 下载安装包2.1.2.3 require …

java遍历字符串的方法

在 java中&#xff0c;我们需要遍历字符串&#xff0c;如何遍历呢&#xff1f;首先我们先了解一下遍历的概念&#xff1a; 在我们的计算机中&#xff0c;存储的都是二进制数据&#xff0c;为了方便存储和管理&#xff0c;我们把一段数据分成多个字符串。在 java中&#xff0c;遍…

BM36-判断是不是平衡二叉树

题目 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是一棵空…

LabVIEW-簇数据类型

簇数据类似于 C 语言的结构体&#xff0c;创建时&#xff0c;首先将“簇”放置到前面板上&#xff1a; 然后放置簇内的元素&#xff0c;比如“数值输入控件”&#xff0c;当“簇框架”内边沿出现虚线框时&#xff0c;单击“数值输入控件”即可添加到簇中:在簇中也可以修改“数值…

常见网络协议汇总(一)

“网络协议”是指为完成特定的任务而制定的一套规则。网络协议通常用来表示数据传输中一组用于实现一个或多个OT模型级别的规则或规范。在通信时&#xff0c;网络协议定义了在通信时如何进行通信。今天海翎光电的小编就汇总了常见的网络协议&#xff0c;来一起看看。我们先回顾…

Linux基础IO(下)

Linux基础IO&#xff08;下&#xff09;FILE自己模拟实现fopen/fclose、fread/fwrite理解文件系统OS如何看待磁盘管理磁盘硬链接软连接ACM时间动态库和静态库见一见Linux下的库为什么要有库写一写库制作一个静态库制作一个动态库关于动静态库的一点小实验FILE 通过前面学习我们…