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

article/2025/10/10 2:00:18

一、认识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;@Testpublic 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;}@Overridepublic void save() {System.out.println("BookServiceImpl...save");bookDao.insert();}
}
dao
接口:
public interface BookDao {public void insert();
}

实现类:


public class BookDaoImpl implements BookDao {@Overridepublic 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;}@Overridepublic 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;@Testpublic 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://chatgpt.dhexx.cn/article/kifbDgE6.shtml

相关文章

分布式定时任务调度实战

目录 1、为什么需要定时任务 2、定时任务调度框架 2.1 单机 2.2 分布 3、xxl-job和elastic-job对比 3.1 支持集群部署方式 3.2 多节点部署任务执行方式 3.3 日志可追溯 3.4 监控告警 3.5 弹性扩容缩容 3.6 支持并行调度 3.7 高可用策略 3.8 失败处理策略 3.9 动态…

浅谈传统定时任务和分布式定时任务

为什么用定时任务&#xff1f; 定时任务平台可以在后台自动检测数据并进行操作。主要应用在订单状态改变、后台统计、定时发送邮件或短信等。 定时任务怎么部署实现&#xff1f; 传统的定时任务可以通过可定时线程池、timertask、quartz、spring-schedule方式来进行处理。他…

分布式定时任务技术选型

1、目前的定时任务方案 Java中开发大多数使用Spring-Scheduler&#xff0c;只需要在Spring中的bean的对应方法加上sheduler注解即可完成我们的定时任务&#xff0c;但是光是用这个注解还远远不能保证定时任务执行多次&#xff0c;我们需要一些其他手段的保证&#xff0c;一般来…

java 分布式 定时任务_Java中实现分布式定时任务的方法

定时器Scheduler在平时使用比较频繁&#xff0c;在springboot中&#xff0c;配置好Scheduled和EnableScheduling之后&#xff0c;定时器就能正常执行&#xff0c;实现定时任务的功能。 但是在这样的情况下&#xff1a;如果开发的服务需要水平部署实现负载均衡&#xff0c;那么定…

【手把手】分布式定时任务调度解析之Quartz

1、任务调度背景 在业务系统中有很多这样的场景&#xff1a; 1、账单日或者还款日上午 10 点&#xff0c;给每个信用卡客户发送账单通知&#xff0c;还款通知。如何判断客户的账单日、还款日&#xff0c;完成通知的发送&#xff1f; 2、银行业务系统&#xff0c;夜间要完成跑批…

轻量级分布式定时任务框架XXL-Job

轻量级分布式定时任务框架XXL-Job: XXL-JOB是一款轻量级的分布式定时任务框架&#xff0c;上手简单&#xff0c;操作容易&#xff0c;XXL-Job可以到官网下载也可以去gitee上拉取源码&#xff0c;其中核心模块分页两个&#xff1a;1&#xff1a;是分布式调度服务&#xff0c; 2&…

Springboot结合Redis实现分布式定时任务

一、背景 之前分享过分布式定时任务的技术选型方案&#xff1a;分布式定时任务技术选型方案&#xff0c;个人青睐xxl_job&#xff0c;分享了搭建接入流程&#xff1a;xxl_job搭建方案&#xff0c;本次项目需求较为简单&#xff0c;同时时间紧张。下面介绍利用Redis锁实现分布式…

分布式定时任务框架说明

分布式定时任务框架说明 分布式定时任务框架说明Quartz概念架构组件springboot集成方式使用内存使用数据库 TBSchedule&#xff1a;elastic-job概念架构组件执行流程特性 satumxxl-job概念特性架构组件使用 分布式定时任务框架说明 Quartz 概念 Quartz&#xff1a;Java事实上…

分布式定时任务对比

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job &#xff0c;quartz , saturn, opencron , antares el…

简单粗暴的分布式定时任务解决方案

分布式定时任务 1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现 1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户…

Java 实现分布式定时任务

文章目录 前言一、技术点二、代码实践1、引入库2、创建启动线程入口3、表结构4、任务解析5、任务拉取 三、结果展示四、总结 前言 最近有一个需求&#xff1a;需要实现分布式定时任务。而市面上的定时任务大多数都是基于Scheduled注解进行实现。不符合需求。所以根据需求整体思…

分布式定时任务调度

前言 什么是分布式定时任务? 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 为什么要采用分布式定时任务&#xff1f; 单点定时任务的缺点: 功能相对简单&#xff0c…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行&#xff0c;或者周期性的去执行某个任务&#xff0c;比如&#xff1a;每天晚上24点做数据汇总&#xff0c;定时发送短信等。 1.2.常见定时任务方案…

几种常用的分布式定时任务

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job quartz saturn opencron antares elastic-job el…

分布式定时任务

分布式定时任务 1&#xff0c;什么是分布式定时任务&#xff1b;2&#xff0c;为什么要采用分布式定时任务&#xff1b;3&#xff0c;怎么样设计实现一个分布式定时任务&#xff1b;4&#xff0c;当前比较流行的分布式定时任务框架&#xff1b; 1&#xff0c;什么是分布式定时…

python类型转换函数str

str函数&#xff0c;将数字转为字符串&#xff1a;

Python 类型转换(数据类型转换函数大全)

文章目录 虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。 比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点…

python怎么转换文件格式_python怎么转换数据类型

在处理数据的时候&#xff0c;经常需要转换数据的格式&#xff0c;来方便数据遍历等操作。下面我们来看一下Python中的几种数据类型转换。 1、字符串转字典&#xff1a;dict_string "{name:linux,age:18}" to_dict eval(dict_string) print(type(to_dict)) 也可以用…

python强制类型转换

1.强转为int string->int a string print(int(a))a 1.2 print(int(a))a 12 print(int(a))string仅在无特殊字符&#xff08;包括小数点&#xff09;且全为数字的情况下可强转为float boolen->int a True b False print(int(a)) print(int(b))float->int a …

python批量转换数据类型_python中数据类型转换

1、list转str 假设有一个名为test_list的list,转换后的str名为test_str 则转换方法: test_str = "".join(test_list) 例子: 需要注意的是该方法需要list中的元素为字符型,若是整型,则需要先转换为字符型后再转为str类型。 2、str转list 假设有一个名为test_str的…