SpringIOC注入的两种方式讲解以及代码示例

Ioc是Spring全家桶各个功能模块的基础,创建对象的容器。

AOP也是以IoC为基础,AOP是面向切面编程,抽象化的面向对象

AOP功能:打印日志,事务,权限处理

AOP的使用会在下一篇文章进行介绍

IoC

翻译为控制反转,即将对象的创建进行反转。常规情况下,对象都是开发者手动创建的,使用IoC开发者不再需要创建对象,而是由IoC容器根据需求自动创建项目所需要的对象

  • 不用IoC:所有对象开发者自己创建;
  • 使用IoC:对象不用开发者创建,而是交给spring框架完成

下面我们使用代码来演示:

1.1、首先我们需要引入依赖

pom.xml

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

1.2 有两种方法创建

1.2.1 基于XML:开发者把需要的对象在XML中进行配置,Spring框架读取这个配置文件,根据配置文件的内容来创建对象

(1)创建DataConfig类,同时加上@Data注解

/*** @author 王凯欣*/
@Data
public class DataConfig {private String url;private String driverName;private String username;private String password;
}

(2)新建spring.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"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean class="com.wkx.ioc.DataConfig" id="config"><property name="driverName" value="Driver"></property><property name="url" value="localhost:8080"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean>
</beans>

这样可以通过反射获取到DataConfig类,存入id为config的对象中,并使用<property>标签来为变量赋值。 

(3)新建Test类

package com.wkx.ioc;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");System.out.println(context.getBean("config"));}
}

通过上面的方式来获取到DataConfig

运行后输出

1.2.2 基于注解(常用)

基于注解有两种方式,

  • 配置类
  • 扫包+注解

第一种:配置类

用一个Java来替代XML文件,把在XML中配置的内容放到配置类

(1)添加BeanConfiguration配置类

@Configuration
public class BeanConfiguration {@Bean(name = "config")public DataConfig dataConfig(){DataConfig dataConfig = new DataConfig();dataConfig.setDriverName("Driver");dataConfig.setUrl("localhost:3306/dbname");dataConfig.setUsername("root");dataConfig.setPassword("root");return dataConfig;}
}

@Configration注解表示这是个配置类,启动时加载

@Bean表示加载时去调用dataConfig,然后将返回的对象DataConfig放入到IoC容器中,供开发者使用。后面的name相当于id,也可以用value替代

(2)编写Test类

public class Test {public static void main(String[] args) {//参数可以是类名.class,也可使用包名AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.wkx.configuration");//这里传入的时前面我们设置的Bean的name/value,如果不设置的话,可以传方法名,或接口名System.out.println(context.getBean("config"));}
}

第二种:扫包+注解

更简单的方式,不再需要依赖于XML或者配置类,而是直接将bean的创建交给目标类,在目标类添加注解来创建

(1)给DataConfig添加@Component注解,目的是告诉spring框架,现在这个类需要被注入到IoC。然后spring读到这个类的时候,就会将这个类创建对象,注入到IoC,@Value注解用来给类中的变量赋值

@Data
@Component
public class DataConfig {@Value("localhost:3306")private String url;@Value("Driver")private String driverName;@Value("root")private String username;@Value("root")private String password;
}

(2)扫包,扫描DataConfi,获取到我们注入的值

public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.wkx.ioc");System.out.println(context.getBean(DataConfig.class));}
}

IoC除了自动创建对象。还有能够依赖注入

那什么是依赖注入呢?

比如A中有B的对象,然后我们创建A和B两个对象,对会自动的把B装入A

下面我举个例子

(1)声明一个全局变量类GlobalConfig,里面包含DataConfig对象,因此要完成依赖注入。此时可以使用@Autowired注解,表示自动装载,他就会自己去IoC里查找

@Data
@Component
public class GlobalConfig {@Value("8080")private String prot;@Value("/")private String path;@Autowiredprivate DataConfig dataConfig;
}

 其中,@Autowired注解表示通过类型byType注入,如果要通过名字注入,给他取名字,可以加上@Qualifier("name")来完成名称的映射,同时,DataConfig中的@Component("name"),两个name要保持一致

(2)再去扫描包

 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.wkx.ioc");System.out.println(context.getBean(GlobalConfig.class));

这样就可以获取到了

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

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

相关文章

filebeat kibana elasticsearch 日志监控

解压三个压缩包 一、filebeat的安装部署 1、打开filebeat的配置文件 2、Filebeat inputs 处打开日志输入开关&#xff0c;设置要监控的路径 3、Outputs 输出中设置Elasticsearch output的输出地址 4、配置kibana 的地址 5、执行 ./filebeat setup -e 二、Elasticsearch 安装…

Debian 系列 Linux 的静态 DNS 、gateway 、IP 设置和网络重启

文章目录 DNS 设置DNS 配置文件DNS 配置文件内容 gateway、IP 设置网络适配器配置文件网络适配器配置文件内容 网络重启 各个 Linux 发行版的网络设置有很大不同。根据最近对 Debian 系列&#xff08;含 Debian 12、基于 Debian 12 的Proxmox 8.0-2 以及基于Debian 11 的 openm…

electron+vue3全家桶+vite项目搭建【25】使用electron-updater自动更新应用

文章目录 引入实现效果实现步骤引入依赖配置electron-buidler文件封装版本升级工具类主进程调用版本更新校验渲染进程封装方法调用 测试版本更新 引入 demo项目地址 electron-updater官网 我们不可能每次发布新的版本都让用户去手动下载安装最新的包&#xff0c;而是应用可以…

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道&#xff0c;layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf&#xff1a;导出按钮的右边那个按钮就是打印pdf的 那么&#xff0c;easyui要怎么实现这些功能呢&#xff1f;这篇文章就…

vue2-vue项目中你是如何解决跨域的?

1、跨域是什么&#xff1f; 跨域本质是浏览器基于同源策略的一种安全手段。 同源策略&#xff08;sameoriginpolicy&#xff09;&#xff0c;是一种约定&#xff0c;它是浏览器最核心也是最基本的安全功能。 所谓同源&#xff08;即指在同一个域&#xff09;具有以下三个相同点…

学C的第三十二天【动态内存管理】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十一天【通讯录的实现】_高高的胖子的博客-CSDN博客 1 . 为什么存在动态内存分配 学到现在认识的内存开辟方式有两种&#xff1a; 创建变量&#xff1a; int val …

mysql数据库备份

数据库备份&#xff0c;数据库为school mysql> create database if not exists school;1.创建student和score表 创建student&#xff1a; CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, d…

C# Blazor 学习笔记(0.1):如何开始Blazor和vs基本设置

文章目录 前言资源推荐环境如何开始Blazor个人推荐设置注释快捷键热重载设置 前言 Blazor简单来说就是微软提供的.NET 前端框架。使用 WebAssembly的“云浏览器”&#xff0c;集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …

vscode无法连接远程服务器的可能原因:远程服务器磁盘爆了

vscode输入密码后一直等待&#xff0c;无法进入远程服务器终端&#xff1a; 同时Remote-SSH输出包含以下内容 在日志中的以下几个部分&#xff1a; [17:15:05.529] > wget download failed 这表明VS Code尝试在远程服务器上下载VS Code服务器时失败了。> Cannot write…

【vue】vue 里面使用 v-html 插入的文本带有换行符‘\n‘不换行

最近开发vue2 项目 &#xff0c;接口返回的是类似于这样的数据&#xff1a;我是第一行的哦\n我是第二行的哦 我是直接这样渲染的&#xff0c; //html <p v-htmltext></p>//渲染值 this.text "我是第一行的哦\n我是第二行的哦"但结果却是不如意&#x…

【JavaScript】本地存储

在JavaScript中&#xff0c;本地存储是一种可以在浏览器中存储数据的机制。它允许开发者在浏览器中保存键值对&#xff0c;并且这些数据可以在同一个域名下的不同页面间进行共享。 JavaScript中常用的本地存储机制有两种&#xff1a;localStorage 和 sessionStorage。 localS…

如何优化Flask应用程序的性能

让我们来谈谈如何优化Flask应用程序的性能。 首先&#xff0c;让我们了解一下什么是性能。性能就是你在做某件事情时所花费的时间和资源。在计算机科学中&#xff0c;性能通常指的是计算机程序运行的速度和质量。对于Web应用程序&#xff0c;性能通常指的是响应时间和服务器的…

js:浏览器环境下普通模式和严格模式use strict下function函数里的this指向

普通模式 普通模式 this 默认指向了Window function foo() {console.log(this); }foo(); // Window严格模式 如果开启严格模式use strict&#xff0c;this 指向的是 undefined function foo() {"use strict";console.log(this); }foo(); // undefined

STM32 UDS Bootloader开发-上位机篇-CANoe制作(3)

文章目录 前言刷写脚本34服务写入数据的实现定时函数writeBlockData函数Checksum总结前言 上一篇文章中介绍了CAPL刷写脚本的大部分内容,本文继续介绍34,36,37服务的实现,及checksum中遇到的坑 刷写脚本 34服务 void requestDownLoad(struct Block hexfile) {gTxBuffer[…

Linux系统部署Python语言开发运行环境

目录 Ubuntu自带python Debian安装python 安装 pip 库列表 安装第三方库 使用国内镜像站 实装 tkinter 库 编写运行代码 测试代码1 1. 创建项目 2. 创建源码文件 3. 写入源代码 4. 修改权限 5. 运行代码 测试代码2 本文的使用环境是Windows的Linux 子系统&…

ChatGPT: 人机交互的未来

ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发&#xff0c;并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式&#xff0c;提供高效、智能…

Go学习第六天

Golang变量内置pair结构详细说明 变量包括&#xff08;type, value&#xff09;两部分type 包括 static type和concrete type. 简单来说 static type是你在编码是看见的类型(如int、string)&#xff0c;concrete type是runtime系统看见的类型类型断言能否成功&#xff0c;取决…

原型模式(C++)

定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 应用场景 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的…

Julia 元编程

Julia 把自己的代码表示为语言中的数据结构&#xff0c;这样我们就可以编写操纵程序的程序。 元编程也可以简单理解为编写可以生成代码的代码。 元编程&#xff08;英语&#xff1a;Metaprogramming&#xff09;&#xff0c;是指某类计算机程序的编写&#xff0c;这类计算机程…

Linux磁盘管理

磁盘管理 基本分区管理 磁盘划分思路 进入分区表&#xff0c;新建分区更新分区表格式化分区表挂载使用 #lsblk #df -h 查看设备挂载情况 #fdisk -l 设备分区情况 #fdisk /dev/sdb 添加一块硬盘&#xff0c;需要将其分两个分区&#xff0c;分别格式化成ext4和vfat格式文件系…