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

一、认识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:自动注入属性。自动注入优先按照类型注入,如果有多个对象,按照名字进行注入

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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

v851s gpio 应用程序编写

1. 查看硬件电路图SCH_Schematic1_2022-11-23 &#xff0c;查找合适的gpio 作为使用pin 在这里我们选取 GPIOH14&#xff08;注意目前开发使用这个pin 作为触摸屏的pin脚&#xff0c;需要将触摸屏connect断开&#xff09; &#xff0c;因为 可以通过排插使用杜邦线将其引出&am…

Maven高级-属性多环境配置与应用

Maven高级-属性&多环境配置与应用4&#xff0c;属性4.1 属性4.1.1 问题分析4.1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version4.2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效4.3…

mysql慢查询

目录标题如何收集慢SQL-- ELK体系收集慢日志分析SQL优化添加索引优化慢sql通过拆分冷热数据优化读写分离预防我们优化的思路是“收集——分析——优化——预防”了解完如何收集慢日志之后&#xff0c;就要开始分析 SQL 了。优化 SQL 的基础手段是 EXPLAIN&#xff0c;我们要收起…

Spark SQL实战(04)-API编程之DataFrame

1 SparkSession Spark Core: SparkContext Spark SQL: 难道就没有SparkContext&#xff1f; 2.x之后统一的 package com.javaedge.bigdata.chapter04import org.apache.spark.sql.{DataFrame, SparkSession}object SparkSessionApp {def main(args: Array[String]): Unit …

认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】

前言 分布式微服务系统中添加登录和注册&#xff0c;&#xff08;这里暂未完成分布式情况下用户登录信息情况记录&#xff09;&#xff0c;主要记录&#xff1a;一个微服务专门管理用户信息。需要通过远程调用的形式&#xff0c;来完成用户注册以及登录流程&#xff0c;同时密…

【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

二分搜索树

一、概念及其介绍 二分搜索树&#xff08;英语&#xff1a;Binary Search Tree&#xff09;&#xff0c;也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件&#xff1a; 若它的左子树不为空&#xff0c;左子树上所有节点的值都小于它的根节点。若它…

视频生成: 基于Stable Diffusion的微调方法

chatGPT带来了几个月的AIGC热度&#xff0c;文本图像生成模型大行其道&#xff0c;但AI在视频生成任务上尚没有较好的开源仓库&#xff0c;并受限于“缺那么几百块A100"的资源问题&#xff0c;大多数人无法展开视频生成的研究。好在目前有不少针对视频生成的相关paper&…

Day936.如何重构过大类 -系统重构实战

如何重构过大类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何重构过大类的内容。 在过去的代码里一定会遇到一种典型的代码坏味道&#xff0c;那就是“过大类”。 在产品迭代的过程中&#xff0c;由于缺少规范和守护&#xff0c;单个类很容易急剧膨胀&#…

Learning C++ No.18【STL No.8】

引言&#xff1a; 北京时间&#xff1a;2023/3/18/21:47&#xff0c;周末&#xff0c;不摆烂&#xff0c;但是欠钱终于还是遭报应了&#xff0c;导致坐牢7小时&#xff08;上午3.5&#xff0c;下午3.5&#xff09;&#xff0c;难受&#xff0c;充分意识到行哥是那么的和蔼可亲…

固定资产管理方案:二维码扫扫便知道

用草料可以批量、简单、低成本地制作固定资产二维码标签。 适用于办公设备、车辆、医疗器械、大型生产设备等需要制作一物一码标签的场景。还能配合报修表单、手机端编辑子码功能共同使用&#xff0c;完成对于固定资产的规范化管理&#xff1a; 用二维码管理公司固定资产1、固定…

【Linux】进程等待进程程序替换

进程等待&进程程序替换进程等待进程程序替换通过进程等待和进程程序替换来理解守护进程进程等待 僵尸进程的产生原因是&#xff1a;子进程先于父进程退出&#xff0c;在子进程退出时会给父进程发送SIGCHILD信号&#xff0c;而父进程接收到这个信号后选择不处理&#xff0c;…

2023年MathorCup数学建模赛题浅析

MathorCup俗称妈杯&#xff0c;是除了美赛国赛外参赛人数首屈一指的比赛&#xff0c;而我们的妈杯今天也如期开赛。今年的妈杯难度&#xff0c;至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…

世纪末的星期

题目 1、世纪末的星期 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。 还有人称今后的某个世纪末的12月31日&#xff0c;如果是星期一则会… 有趣的是&#xff0c;任何一个世纪末的年份的12月31日都不可能是星期一!! 于是&#xff0c;“谣言制造商”又修改为星…

cuda ptx 汇编语言示例:读寄存器

编译 , Ampere 显卡&#xff0c;rtx 3060 3070... nvcc -archsm_86 -o hello hello_ptx.cu 或写成Makefile&#xff1a; hello: hello_sm_id.cunvcc -archsm_86 -o $ $^ #nvcc -archsm_86 -o hello hello_sm_id.cu $ 是指目标 $^ 是指第一个依赖 ^^ hello_ptx.cu #…

WinHex安装与使用

目录 下载WinHex 安装WinHex 查看现成的磁盘文件 手动创建磁盘文件 创建磁盘文件 创建分区 安装引导程序 查看磁盘 下载WinHex 下载链接&#xff1a; WinHex: Hex Editor & Disk Editor, Computer Forensics & Data Recovery Software 安装WinHex 1).下载完…

商贸批发进销存管理软件,仓库条码管理,库存管理。采购入库单,供应商档案管理。

公司发生采购业务&#xff0c;就需要对【供应商】档案进行管理。【供应商】档案包括&#xff1a;编号&#xff0c;名称&#xff0c;地址&#xff0c;电话&#xff0c;负责人&#xff0c;等信息。建立好【供应商】档案电脑存档&#xff0c;方便随时查阅&#xff0c;和统计分析。…

MySQL:安装 MySQL、Navicat、使用 Navicat 连接 MySQL

文章目录Day 01&#xff1a;一、概念1. 数据库 DB2. 数据库管理系统 DBMS3. MySQL二、安装 MySQL三、安装 Navicat Premium 16四、使用 Navicat 连接 MySQL注意&#xff1a;Day 01&#xff1a; 一、概念 1. 数据库 DB 数据库&#xff1a;DB (Database) 数据仓库&#xff0c;…

重磅!阿里版本【ChatGPT】开放测评!

前两天突然爆出惊人消息&#xff1a;阿里版ChatGPT开放测评了&#xff01; 在本月初&#xff0c;已经有诸多关于阿里巴巴即将推出类似ChatGPT产品的传闻。 数日前&#xff0c;首批曝光的天猫精灵“鸟鸟分鸟”脱口秀版GPT基于大型模型的“精简版”&#xff0c;凭借其出色的表现吸…

快看这些wireshark 命令,必须得会!

wireshark捕获命令 捕获器表达式语法&#xff1a; 限定词三类 Type&#xff1a;host、net、prot 指出其后数字或名字的意义&#xff08;主机&#xff0c;网段&#xff0c;端口&#xff09; Direction&#xff1a;src、dst 指出传输方向 &#xff08;源 、目的&#xff09; …