Sping的IoC容器和依赖注入

news/2024/4/20 8:23:07/文章来源:https://blog.csdn.net/qq_61057438/article/details/127608711

IoC

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

Spring实现了IoC的思想,Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部

Ioc容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称为Bean

DI

Dependency Injection
依赖注入,在容器建立bean于bean之间的依赖关系的过程

IoC的使用

首先,还是需要我们导入一个Maven坐标

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency>

之后,在resources文件夹下,新建一个Spring的XML配置文件
在这里插入图片描述
之后再配置文件中,配置bean
id表示给bean取名字
class定义bean的类型

<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>

获取IoC容器

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

获取bean

BookDao bookDao = (BookDao) context.getBean("bookDao");

DI的使用

在类中定义一个set方法

public class BookServiceImpl implements BookService {private BookDao bookDao;public void save(){System.out.println("book service save");bookDao.save();}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}

配置二者的关系
name中要填的是set方法后的首字符改小写后的结果
ref中填的是bookDao的bean的名字

<bean id="bookService" class="com.service.Impl.BookServiceImpl"><property name="bookDao" ref="bookDao"></property></bean>

还是获取IoC容器和bean

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) context.getBean("bookService");

bean标签的说明

bean是默认为单例
但是可以通过修改其scope属性来改变其是否为单例

修改为非单例

<bean id="bookDao" class="com.dao.impl.BookDaoImpl" scope="prototype"></bean>

还可以给bean设置名字
name属性中的所有都可以为改bean的名字

<bean id="bookDao" name="asdas adasdasasd asdasad" class="com.dao.impl.BookDaoImpl" ></bean>

Bean的实例化方法

第一种

构造方法,提供可访问的构造器,它的底层是基于反射的原理,因此无论构造器私有与否,其都能获取
想之前示例中的就是这种方法,不过一般无参构造器器默认不写。

第二种

静态工厂

下面是一个标准的工厂模式

public interface UserDao {public void save();
}
public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("userdao save");}
}
public class UserDaoFactory {public static UserDao getUserDao(){return new UserDaoImpl();}
}

对于这种静态的工厂,我们的bean对象配置,也要变化

<bean id="UserDao" class="factory.UserDaoFactory" factory-method="getUserDao"></bean>

第三种

实例工厂

一个实例工厂

public class OrderDaoImpl implements OrderDao {@Overridepublic void save() {System.out.println("OrderDao save");}
}
public interface  OrderDao {public void save();
}
public class OrderDaoFactory {public OrderDao getOrderDao(){return new OrderDaoImpl();}
}

对于这种我们就需要自己创建一个工厂的bean对象

<bean id="OrderDaoFactory" class="factory.OrderDaoFactory"></bean><bean id="OrderDao" factory-method="getOrderDao" factory-bean="OrderDaoFactory"></bean>

那么有没有一种不需要建立额外的bean对象的方法呢

显然是有的,我们可以实现一下FactoryBean接口,这个接口是一个泛型接口,因此我们可以在里面确定一个类

public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {@Overridepublic OrderDao getObject() throws Exception {return new OrderDaoImpl();}@Overridepublic Class<?> getObjectType() {return OrderDao.class;}
}

这时候配置bean对象就非常的简单了

<bean id="OrderDao" class="factory.OrderDaoFactoryBean"></bean>

依赖注入

setter注入

就是在要创建的bean类中加入set方法

不仅仅可以为类,也可以是基本的数据类型

public class BookServiceImpl implements BookService {private BookDao bookDao;private int number;public void save(){System.out.println("book service save");System.out.println(number);bookDao.save();}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}
}

bean配置

 <bean id="bookService" class="com.service.Impl.BookServiceImpl"><property name="bookDao" ref="bookDao"></property><property name="number" value="10"></property></bean>

构造器注入

其实就是用一个构造器取代set方法

public class BookServiceImpl implements BookService {private BookDao bookDao;private int number;public BookServiceImpl(BookDao bookDao, int number) {this.bookDao = bookDao;this.number = number;}public BookServiceImpl() {}public void save(){System.out.println("book service save");System.out.println(number);bookDao.save();}}

而这里的bean的配置也要做相应的改变

<bean id="bookService" class="com.service.Impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"></constructor-arg><constructor-arg name="number"  value="100"></constructor-arg></bean>

不过这种方法的代码耦合度较高,应为name后面的填的和构造器中的形参相关,因此我们可以选择不用name,改用参数的位置下标,index

<bean id="bookService" class="com.service.Impl.BookServiceImpl"><constructor-arg index="0" ref="bookDao"></constructor-arg><constructor-arg index="1"  value="100"></constructor-arg></bean>

Spring 配置第三方资源

以Druid为例

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/logindemo"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean>

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

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

相关文章

【CSS】CSS选择器全解指南【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 本文目录【CSS选择器全解指南】&#x1f319;CSS注…

SpringBoot 转发请求至指定页面

1、前言 原先的页面访问地址为&#xff1a;http://127.0.0.1:8888/office/schdule/index/&#xff0c; 重构项目&#xff0c;SpringBoot 项目&#xff0c;前后分离&#xff0c;前端文件放置静态目录&#xff08;static&#xff09;下&#xff0c;访问地址&#xff1a;http://12…

计算机毕业设计(附源码)python疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

URP下的OffScreen Particle Render

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。随着越来越多的项目使用…

jsp个人评价管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 个人评价管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

多模态自编码器从EEG信号预测fNIRS静息态

导读 本研究介绍了一种深度学习架构&#xff0c;用于评估40名癫痫患者的多模态脑电图(EEG)和功能性近红外光谱(fNIRS)记录。长短期记忆网络和卷积神经网络集成在一个多模态序列到序列的自编码器中。训练后的神经网络通过从EEG全谱和特定EEG频段中分层提取深度特征&#xff0c;…

fscan:一键自动化、全方位漏洞扫描的开源工具

https://blog.csdn.net/osfront/article/details/116049846 打开服务器看到了一个软件fscan64,并有运行页面。因为没见过,吓了我一跳,搜索了下是什么,记录下。 简介 fscan 是一个内网综合扫描工具,方便一键自动化、全方位漏洞扫描。 它支持主机存活探测、端口扫描、常见服务…

【Java数据结构】顺序表

我们不过是普通人&#xff0c;只不过在彼此眼中闪闪发光 目录 1.模拟实现顺序表 1.1 顺序的结构 1.2 顺序表的成员属性 1.3 顺序表的构造方法 1.4 顺序表的成员方法 1.4.1 扩容 1.4.2 打印顺序表 1.4.3 尾插 1.4.4 在指定位置插入 1.4.5 判断数组中是否有这个元素…

SSH婴幼儿产品销售系统电商购物系统(含源码+论文+答辩PPT等)

该项目采用技术JSP、strust2、Spring、Hibernate、Tomcat服务器、MySQL数据库 &#xff0c;项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程 本系统结构如下&#xff1a; 1&#xff0c;游客访问 |–系统首页&#xff0c;查看所有的商品信息和相关的菜单信息 |–…

每日一记:笔记工具使用、计算机基础知识、编程语言认识

1、笔记工具的使用 我现在使用的是typora这个文档工具 markdown语法 常见操作有&#xff1a;标题、代码块、引用、列表等 typora工具的主页面 我们可以编辑内容 做笔记 。。。 标题分类&#xff1a; 和html&#xff08;超文本标记语言 前端部分一样&#xff09;分为六级标题…

拉卡拉第三季营收13.45亿:净利8372万 同比降73%

雷递网 雷建平 10月31日拉卡拉支付股份有限公司&#xff08;证券代码&#xff1a;300773&#xff0c;证券简称&#xff1a;拉卡拉&#xff09;日前发布财报&#xff0c;财报显示&#xff0c;拉卡拉2022年前三季营收43.55亿元&#xff0c;同比降11.83%&#xff1b;拉卡拉2022年前…

Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

文章目录Shell字符串单引号双引号拼接字符串获取字符串长度提取子字符串查找子字符串Shell数组定义数组读取数组获取数组的长度Shell注释流程控制if判断case语句for 循环while 循环read 读取控制台输入Shell字符串 字符串是shell编程中最常用最有用的数据类型&#xff08;除了…

【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计

写在前面 本系列为 DDR3 控制器设计总结&#xff0c;此系列包含 DDR3 控制器相关设计&#xff1a;认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等&#xff0c;附上汇总博客直达链接。 【DDR3 控制器设计】系列…

爆破校园网的宽带

前提&#xff1a;学校的手机号前7位相同&#xff0c;宽带密码都是手机号后六位。仅供学习。 准备工作&#xff1a;电脑一台&#xff0c;把校园网的宽带水晶头插在电脑上&#xff0c; 步骤&#xff1a; winR输入Rasphone点击新建&#xff0c;宽带&#xff0c;输入宽带名称&am…

Kubernetes(31):kubeasz单主机模式

前言 有时候&#xff0c;我们只需要k8s集群进行项目测试&#xff0c;能够使用的主机可能只有一台&#xff0c;那么如何构建一台单机的k8s集群&#xff1f; 单机版的k8s集群可以用于本地测试&#xff0c;或者内部测试环境&#xff0c;或者个人电脑上的项目测试。 那么我们可以使…

Html保留空格和换行

效果&#xff1a; 代码&#xff1a; <pre> 这是一段文本这是一段文本这是一段文 本这是一 段文本这是一段文本 </pre>

会话技术(Session、Cookie)详细介绍

会话技术 request&#xff1a;接收请求 接收请求行 接收请求方式&#xff1a;request.getMethod()接收项目路径&#xff1a;request.getContextPath() 接收请求头 request.getHeader(String name) 接收请求参数 中文参数&#xff1a; get方式&#xff1a;不乱码。因为tomcat8.…

NIO Buffer类的重要方法

1 allocate()创建缓冲区 在使用Buffer&#xff08;缓冲区&#xff09;之前&#xff0c;我们首先需要获取Buffer子类的实例对象&#xff0c;并且分配内存空间。为了获取一个Buffer实例对象&#xff0c;这里并不是使用子类的构造器new来创建一个实例对象&#xff0c;而是调用子类…

带你走入C++动态多态的底层

多态按字面的意思就是多种形态&#xff0c;相同的方法调用&#xff0c;但是有不同的实现方式。多态性可以简单地概括为“一个接口&#xff0c;多种方法&#xff0c;实现接口与实现的分离。 C有两种多态形式&#xff1a; 静态多态动态多态而本文主要介绍动态多态的应用。 动态…

力扣1662(javapython)-检查两个字符串数组是否相等(简单)

题目: 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。示例 1: 输入:word1 = ["ab", "c"], word2 = ["a", "bc…