Spring基础 - Spring核心之控制反转(IOC)

Spring基础 - Spring核心之控制反转(IOC)

引入

  • Spring框架管理这些Bean的创建工作,用户管理Bean转变为框架管理Bean,这个称之为控制翻转
  • Spring框架托管创建的Bean放在IOC容器中
  • Spring框架为了更好让用户配置Bean,必然会引入不同方式来配置Bean,这便是xml配置,java配置,注解配置
  • Spring需要管理整个Bean的生命周期
  • 应用程序代码从Ioc Container中获取以来的Bean资源,注入到应用程序中,这个过程叫做依赖注入,所以说控制翻转通过依赖注入实现,
  • IOC是设计思想,DI是实现方式
  • 在依赖注入,autowired,resource

如何理解IoC

  • Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的,这里所定义的bean就相当于给了你一个更为简便的方法来调用这个组件去实现你要完成的功能

  • 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)

  • 传统程序设计下,都是主动去创建相关对象然后再组合起来:

在这里插入图片描述

  • 当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了

在这里插入图片描述

  • 在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了

IoC和DI是什么关系

  • 组件之间的依赖关系由容器在运行期间决定
  • 依赖注入的目的是为了提升组件重用的频率,为系统搭建一个灵活可扩展的平台
  • 通过依赖注入机制,我们只需要通过简单的配置,无需任何代码就可以指定目标需要的资源,完成自身的业务逻辑
  • 应用程序依赖于IOC容器
  • 应用程序需要IOC容器来提供对象需要的外部资源
  • IOC容器注入应用程序某个对象,应用程序依赖的对象
  • 注入某个对象所需要的外部资源

Ioc 配置的三种方式

xml配置

  • 将Bean的信息配置xml文件里,通过spring加载文件为我们创建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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- services --><bean id="userService" class="tech.pdai.springframework.service.UserServiceImpl"><property name="userDao" ref="userDao"/><!-- additional collaborators and configuration for this bean go here --></bean><!-- more bean definitions for services go here -->
</beans>

Java 配置

  • 将类的创建交给我们配置的JavaConfig来完成,Spring只负责维护和管理,采用纯Java创建方式,本质将xml配置声明转移到Java配置类
  • 创建一个配置类,添加@Configuration注解声明为配置类
  • 创建方法,方法加上Bean注解,该方法用于创建实例并且返回,创建之后交给spring管理

/*** @author pdai*/
@Configuration
public class BeansConfig {/*** @return user dao*/@Bean("userDao")public UserDaoImpl userDao() {return new UserDaoImpl();}/*** @return user service*/@Bean("userService")public UserServiceImpl userService() {UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(userDao());return userService;}
}

注解配置

  • 通过在类上加注解的方式,来声明一个类交给Spring管理
  • Spring会自动扫描带有Component Controller Service Repository
  • 需要配置Spring的注解扫描器
  • 对类添加@Component相关的注解,比如@Controller,@Service,@Repository
  • 设置ComponentScan的basePackage, 比如<context:component-scan base-package=‘tech.pdai.springframework’>, 或者@ComponentScan(“tech.pdai.springframework”)注解,或者 new AnnotationConfigApplicationContext(“tech.pdai.springframework”)指定扫描的basePackage.
/*** @author pdai*/
@Service
public class UserServiceImpl {/*** user dao impl.*/@Autowiredprivate UserDaoImpl userDao;/*** find user list.** @return user list*/public List<User> findUserList() {return userDao.findUserList();}}

依赖注入的三种方式

  • 构造方法注入(Construct注入)
  • Setter注入
  • 基于注解的注入(接口注入)
setter方式
  • 在XML配置方式中,property都是setter方式注入
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- services --><bean id="userService" class="tech.pdai.springframework.service.UserServiceImpl"><property name="userDao" ref="userDao"/><!-- additional collaborators and configuration for this bean go here --></bean><!-- more bean definitions for services go here -->
</beans>
  • 需要new UserServiceImpl()创建对象 所以需要默认构造函数
  • 调用setUserDao函数注入userDao的值,所以需要setUserDao函数
/*** @author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private UserDaoImpl userDao;/*** init.*/public UserServiceImpl() {}/*** find user list.** @return user list*/public List<User> findUserList() {return this.userDao.findUserList();}/*** set dao.** @param userDao user dao*/public void setUserDao(UserDaoImpl userDao) {this.userDao = userDao;}
}
在注解和Java配置方式下

/*** @author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private UserDaoImpl userDao;/*** find user list.** @return user list*/public List<User> findUserList() {return this.userDao.findUserList();}/*** set dao.** @param userDao user dao*/@Autowiredpublic void setUserDao(UserDaoImpl userDao) {this.userDao = userDao;}
}
构造函数
  • 在XML配置方式中,是通过构造函数参数注入,比如下面的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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- services --><bean id="userService" class="tech.pdai.springframework.service.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"/><!-- additional collaborators and configuration for this bean go here --></bean><!-- more bean definitions for services go here -->
</beans>
  • 本质上是new UserServiceImpl(userDao)创建对象, 所以对应的service类是这样的:
/*** @author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private final UserDaoImpl userDao;/*** init.* @param userDaoImpl user dao impl*/public UserServiceImpl(UserDaoImpl userDaoImpl) {this.userDao = userDaoImpl;}/*** find user list.** @return user list*/public List<User> findUserList() {return this.userDao.findUserList();}}

@Autowired和@Resource以及@Inject等注解注入有何区别?

  • @Autowired是Spring自带的注解,通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入

  • @Autowired可以作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE

  • @Autowired默认是根据类型(byType )进行自动装配的

  • 如果有多个类型一样的Bean候选者,需要指定按照名称(byName )进行装配,则需要配合@Qualifier。

  • 将@Autowired写在被注入的成员变量上,setter或者构造器上,就不用再xml文件中配置了。

resource

1、@Resource是JSR250规范的实现,在javax.annotation包下
2、@Resource可以作用TYPE、FIELD、METHOD上
3、@Resource是默认根据属性名称进行自动装配的,如果有多个类型一样的Bean候选者,则可以通过name进行指定进行注入

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

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

相关文章

机器学习:回归决策树(Python)

一、平方误差的计算 square_error_utils.py import numpy as npclass SquareErrorUtils:"""平方误差最小化准则&#xff0c;选择其中最优的一个作为切分点对特征属性进行分箱处理"""staticmethoddef _set_sample_weight(sample_weight, n_samp…

跳跃表的底层实现

跳跃表的底层是由 C 语言实现的&#xff0c;它的实现源码如下&#xff1a; typedef struct zskiplistNode {// 成员对象robj *obj;double score; // 分值struct zskiplistNode *backward; // 回退指针//层struct zskiplistLevel {// 前进指针struct zskiplistNode *forward;//…

缓存穿透、缓存击穿与缓存雪崩

缓存穿透、缓存击穿与缓存雪崩 1.本质区别 缓存穿透指的是数据库不存在数据&#xff0c;导致无法缓存&#xff0c;每次查询都查数据库&#xff0c;数据库压垮 缓存击穿指的是缓存键值对key过期了&#xff0c;key过期期间&#xff0c;大量请求访问&#xff0c;不经过缓存&…

USMART是什么?

一、USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff0c;为正点原子为STM32开发的类似linux中shell的调试工具。 一般开发者正常情况下&#xff0c;对单片机功能进行调试的过程大致为&#xff1a;下载——调试——修改——下载——调试——…

【精选】java初识多态 子类继承父类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

Jumserver 安装

一、Jumserver 官网地址 Jumserver官网地址 二、Jumserver的基本概率 1、4a概率 首先&#xff0c;堡参机提供了运维安全审计的4A规范 Authentication: 身份鉴别&#xff0c;防止身份冒用和复用(开发10人&#xff0c;测试5人&#xff0c;运维2人&#xff09; Authorizatton:授…

【微机原理与单片机接口技术】MCS-51单片机的引脚功能介绍

前言 MCS-51是指由美国Intel公司生产的一系列单片机的总称。MCS-51系列单片机型号有很多&#xff0c;按功能分位基本型和增强型两大类&#xff0c;分别称为8051系列单片机和8052系列单片机&#xff0c;两者以芯片型号中的末位数字区分&#xff0c;1为基本型&#xff0c;2为增强…

如何看待频域与时域的仿真差别

从信号与系统理论中,可以知道,对于占空比为50%的周期信号,只含有奇次谐波,实际中,时钟信号并不是理想的占空比为50%的梯形波,因此,会同时含有奇偶次谐波,一个典型的案例,DDR仿真中,如果用模拟的理想激励源,如下图所示,可以发现,频谱中只会存在基频及其奇次谐波。 …

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

C#,佩尔数(Pell Number)的算法与源代码

1 佩尔数&#xff08;Pell Number&#xff09; 佩尔数&#xff08;Pell Number&#xff09;是一个自古以来就知道的整数数列&#xff0c;由递推关系定义&#xff0c;与斐波那契数类似。佩尔数呈指数增长&#xff0c;增长速率与白银比的幂成正比。它出现在2的算术平方根的近似值…

Qt简易登录界面

代码&#xff1a; #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);ui->background->setPixmap(QPixmap(":/qt picture/logo.png"))…

三极管从入门到精通

文章目录 摘要1 基础1.1 PN结1.2 三极管 2 三极管模拟电路知识2.1 I-V特性曲线2.2 极限参数解释2.3 基本共射极放大电路2.4 小信号模型2.5 用小信号模型分析基本共射极放大电路 3 三极管实际模拟电路应用图3.1 共射极放大电路3.1.1 基本共射极放大电路3.1.2 基极分压式射极偏置…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字&#xff0c;组件配置对象)…

REvil/Sodinokibi勒索病毒通用解密工具

前言 REvil/Sodinokibi勒索病毒相信关注我公众号的朋友&#xff0c;应该都不会陌生了&#xff0c;如果不清楚的可以去翻看之前的文章吧&#xff0c;如果你见过类似下面这样的勒索病毒攻击之后的电脑桌面&#xff0c;如下所示&#xff1a; 或者你见过这样的勒索提示界面&#x…

【跳槽须知】关于企业所签订的竞业协议你知道多少?

年后跳槽须知自己签订的合同中是否存在竞业协议&#xff0c;谨防协议造成经济损失 &#x1f413; 什么是竞业协议 竞业协议时用于保护自己的权益&#xff0c;在员工离职时决定是否启动的一种协议&#xff0c;避免一些掌握公司机密的一些重要岗位人才流入竞争对手的公司&#xf…

数字信号处理 试题 复盘解答(八)

数字信号处理 试题 复盘解答&#xff08;八&#xff09; ps:仅 用作复盘 和回顾知识点&#xff0c;如果有疑问或者错误请提出。 涉及年份 &#xff1a;19 - 21年 六、 个人感觉缺少条件 七、 使用双线性变换法对一个最小相位模拟滤波器进行数字化得到的数字滤波器一般来说不再…

GEE Colab——如何利用Matplotlib在colab中进行图形制作

在colab中绘制图表 笔记本的一个常见用途是使用图表进行数据可视化。Colaboratory 提供多种图表工具作为 Python 导入,让这一工作变得简单。 Matplotlib Matplotlib 是最常用的图表工具包,详情请查看其文档,并通过示例获得灵感。 线性图 线性图是一种常见的图表类型,用…

MySQL篇----第十六篇

系列文章目录 文章目录 系列文章目录前言一、数据库中的事务是什么?二、SQL 注入漏洞产生的原因?如何防止?三、为表中得字段选择合适得数据类型四、存储时期前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇…

IDEA-将压缩的一行代码恢复到原有格式

背景 有时需要将原来的一行代码恢复到未压缩前的格式&#xff0c;方便查看 示例&#xff1a; 通过IDEA自带的功能&#xff1a; 快捷键&#xff1a; MAC版&#xff1a;option command L 效果&#xff1a;

计算机网络基础 第一章——计算机网络概论 知识点

1.1计算机网络的形成与发展 1.计算机网络的特点 &#xff08;1&#xff09;计算机网络技术在现代社会发展中的作用 ●21世纪一个重要特征是:数字化、网络化与信息化&#xff0c;它的基础是支持全社会的、强大的计算机网络。 ●计算机网络是当今计算机学科中发展最为迅速的技…