初识Spring-ioc
初识Spring-ioc
- 1. Spring的简介
- 2.Spring容器ioc的特点
- 3.spring注入方式
- 1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用Setter方法来注入所需的依赖。
- 2.构造函数注入
- 3.在Spring IOC(控制反转)中,"byname"和"bytype"是两种不同的依赖注入方式。
- 4.总结
1. Spring的简介
Spring是一个开源的Java开发框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的编程模型,使得开发者可以更加简单地构建可扩展、可维护的应用程序。
Spring框架的核心特性包括依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented
Programming)。依赖注入使得开发者可以将对象之间的依赖关系交由框架来管理,从而降低了组件之间的耦合度。面向切面编程则提供了一种在应用程序中横切关注点的方式,例如日志记录、事务管理等。
Spring框架还提供了许多其他功能和模块,如Spring MVC用于构建Web应用程序、Spring
Data用于简化数据库访问、Spring
Security用于身份验证和授权等。这些模块可以根据需要进行选择和集成,使得开发者可以根据自己的需求来构建定制化的应用程序。
总的来说,Spring框架通过提供一种简单、灵活的开发方式,帮助开发者构建高效、可扩展的Java应用程序。它已经成为Java开发领域中最受欢迎的框架之一,并被广泛应用于各种企业级应用程序的开发中。
2.Spring容器ioc的特点
Spring的IOC(Inversion of Control)容器是Spring框架的核心组件之一,它具有以下特点:
依赖注入(Dependency Injection)
:IOC容器通过依赖注入的方式管理对象之间的依赖关系。开发者只需要定义好对象之间的依赖关系,IOC容器会负责实例化对象并自动注入所需的依赖,从而降低了组件之间的耦合度。
配置灵活性:IOC容器使用外部配置文件(如XML、注解或Java配置类)来描述对象的创建和依赖关系,这使得应用程序的配置更加灵活。开发者可以根据需要修改配置文件,而无需修改源代码,从而实现应用程序的灵活性和可维护性。
单例管理:IOC容器默认情况下管理的对象是单例的,即每个对象在容器中只有一个实例。这样可以节省资源并提高性能。开发者也可以通过配置来改变对象的作用域,如原型(每次请求都创建新的实例)或会话(每个会话创建一个实例)。
生命周期管理:IOC容器负责管理对象的生命周期,包括对象的创建、初始化和销毁。开发者可以通过配置回调方法(如初始化方法和销毁方法)来实现对对象生命周期的控制。
AOP集成:IOC容器与面向切面编程(AOP)紧密集成,可以通过配置将横切关注点(如日志、事务管理)应用到应用程序中的多个对象上,从而提高代码的重用性和可维护性。
总的来说,Spring的IOC容器通过依赖注入、灵活的配置、单例管理、生命周期管理和AOP集成等特点,提供了一种简单、灵活、可扩展的对象管理机制,帮助开发者构建可维护、可测试的应用程序。
3.spring注入方式
Spring框架提供了多种方式来实现依赖注入(Dependency Injection): 构造函数注入(Constructor
Injection):通过构造函数来注入依赖。在类的构造函数中声明依赖的参数,Spring容器会根据配置自动实例化并注入所需的依赖。
1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用Setter方法来注入所需的依赖。
模拟:
package com.niyin.ioc.web;import com.niyin.ioc.impl.UserServiceImpl;
import com.niyin.ioc.impl.UserServiceImpl1;
import com.niyin.ioc.service.UserService;import java.util.List;public class GoodsAction {private UserService userService;private String gname;private int age;private List<String>peoples;public String getGname() {return gname;}public void setGname(String gname) {this.gname = gname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<String> getPeoples() {return peoples;}public void setPeoples(List<String> peoples) {this.peoples = peoples;}public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public String update(){userService.update();return "list";}
public void pros(){System.out.println(this.gname);System.out.println(this.age);System.out.println(this.peoples);
};}
package com.niyin.ioc.demo;import com.niyin.ioc.web.GoodsAction;
import com.niyin.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class demo1 {public static void main(String[] args) {ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/sping-context.xml");UserAction userAction= (UserAction) context.getBean("userAction");userAction.update();GoodsAction goodsAction= (GoodsAction) context.getBean("goodsAction");goodsAction.update();System.out.println("--------------------------------");goodsAction.pros();System.out.println("---------------------------------");userAction.pros();}}
<bean class="com.niyin.ioc.web.GoodsAction" id="goodsAction"><property name="userService" ref="userService"></property><property name="gname" value="雨伞"></property><property name="age" value="1"></property><property name="peoples" ><list><value>男的</value><value>女的</value></list></property></bean>
2.构造函数注入
package com.niyin.ioc.web;import com.niyin.ioc.impl.UserServiceImpl;
import com.niyin.ioc.service.UserService;import java.util.List;public class UserAction {private UserService userService;private String uname;private int age;private List<String>hobby;public UserAction() {}public UserAction(String uname, int age, List<String> hobby) {this.uname = uname;this.age = age;this.hobby = hobby;}public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public String update(){userService.update();return "list";}public void pros(){System.out.println(this.uname);System.out.println(this.age);System.out.println(this.hobby);};
}
package com.niyin.ioc.demo;import com.niyin.ioc.web.GoodsAction;
import com.niyin.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class demo1 {public static void main(String[] args) {ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/sping-context.xml");UserAction userAction= (UserAction) context.getBean("userAction");userAction.update();GoodsAction goodsAction= (GoodsAction) context.getBean("goodsAction");goodsAction.update();System.out.println("--------------------------------");goodsAction.pros();System.out.println("---------------------------------");userAction.pros();}}
<bean class="com.niyin.ioc.web.UserAction" id="userAction"><property name="userService" ref="userService"></property>
<constructor-arg name="uname" value="袁辉sb"></constructor-arg><constructor-arg name="age" value="11"></constructor-arg><constructor-arg name="hobby" ><list><value>农村</value><value>农村</value><value>农村</value></list></constructor-arg></bean>
3.在Spring IOC(控制反转)中,"byname"和"bytype"是两种不同的依赖注入方式。
ByName(按名称):当使用ByName方式进行依赖注入时,Spring容器会根据依赖对象的名称来进行匹配和注入。在配置文件中,需要使用元素的name属性来指定依赖对象的名称。Spring容器会在容器中查找与指定名称匹配的bean,并将其注入到相应的属性中。
4.1 使用Spring MVC框架:Spring MVC是Spring框架的一部分,用于开发基于MVC模式的Web应用程序。通过配置Spring MVC,可以将请求映射到相应的控制器,并实现灵活的请求处理和视图渲染。
4.2 使用Spring Boot:Spring Boot是Spring框架的扩展,用于简化Spring应用程序的开发和部署。Spring Boot提供了内嵌的Web容器,可以直接运行Spring应用程序,无需额外配置。
4.3 使用Spring和其他Web容器的集成:Spring框架可以与其他常见的Web容器(如Tomcat、Jetty等)进行集成,通过配置文件或注解来实现。
配置监听器
1.监听器
package com.niyin.ioc.listerner;import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class SpingLoadListener implements ServletContextListener {public void contextInitialized(ServletContextEvent sce) {ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/sping-context.xml");
ServletContext servletContext= sce.getServletContext();
servletContext.setAttribute("springContext",context);}
}
2.servlet
package com.niyin.ioc.web;import com.niyin.ioc.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/userList")
public class userservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ClassPathXmlApplicationContext context= (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("spingContext");UserService userService= (UserService) context.getBean("userService");System.out.println(userService);userService.update();}
}
4.总结
本文深入探讨了Spring IOC容器的工作原理,包括配置文件、Bean的定义、实例化、装配、生命周期管理和获取等方面。通过理解和应用Spring IOC容器,我们可以更好地开发和管理Java应用程序,提高代码的可维护性和可测试性。希望本文对读者有所帮助,谢谢阅读!
相关文章:
初识Spring-ioc
初识Spring-ioc 1. Spring的简介2.Spring容器ioc的特点3.spring注入方式1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用S…...
windows10 安装WSL2, Ubuntu,docker
AI- 通过docker开发调试部署ChatLLM 阅读时长:10分钟 本文内容: window上安装ubuntu虚拟机,并在虚拟机中安装docker,通过docker部署数字人模型,通过vscode链接到虚拟机进行开发调试.调试完成后,直接部署在云…...
Java面试题目汇总
一、面向对象的三个基本特征 2、方法重载和方法重写的概念和区别 3、接口和内部类、抽象类的特性 4、文件读写的基本类 **5、串行化的注意事项以及如何实现串行化 6、线程的基本概念、线程的基本状态以及状态之间的关系 7、线程的同步、如何实现线程的同步 8、几种常用的数据结…...
【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 介绍】
文章目录 GCC objcopy 简介objcopy 常用参数GCC objdump 简介GCC readelf 介绍GCC nm 介绍上篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 详细介绍 下篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解 GCC objcopy 简介 objcopy 是 GNU二进制工具集(…...
c语言每日一练(9)
前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
毫米波射频方案分析
豪米波被誉为能够带来令人难以置信的网络吞吐量数据,但迄今为止它的采用一直乏善可陈。 毫米波技术的领导者高通公司认为,他们拥有高达60亿美元的前端机会。这 60亿美元将需要在日本、中国、韩国、欧洲和印度广泛采用 mmWave。尽管有这个巨大的机会&am…...
神经网络基础-神经网络补充概念-04-梯度下降法
概念 梯度下降法是一种常用的优化算法,用于在机器学习和深度学习中更新模型参数以最小化损失函数。它通过迭代地调整参数,沿着损失函数的负梯度方向移动,从而逐步逼近损失函数的最小值。 基本思想 梯度下降法的基本思想是:在每…...
神经网络基础-神经网络补充概念-45-指数加权平均
概念 指数加权平均(Exponential Moving Average,EMA)是一种平均方法,用于平滑时间序列数据或者计算变量的滚动均值。它对数据的权重分布呈指数递减,越靠近当前时刻的数据权重越高,越远离当前时刻的数据权重…...
模型预测笔记(一):数据清洗及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况(二分类) 5.2 柱状图5.2.1 单特征与目标特征之间的…...
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据)
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 K最近邻(K-Nearest Neighbors,简称KNN)是一种简单但常用的机器学习算法,用于分类和回归问题。它的核心思想是基于已…...
Centos 7 通过Docker 安装MySQL 8.0.33实现数据持久化及my.cnf配置
要在 CentOS 7 上使用 Docker 启动 MySQL 8.0.33,并配置 MySQL 的 my.cnf 文件,同时实现 MySQL 数据的持久化,可以按照以下步骤进行操作: 1、安装 Docker:确保你在 CentOS 7 上已经安装了 Docker。如果尚未安装&#…...
自夹持P型屏蔽型碳化硅沟槽型绝缘栅双极晶体管,用于低开通电压和开关损耗
目录 标题:Self-Clamped P-shield SiC Trench IGBT for Low On-State Voltage and Switching LossProceedings of the 35st International Symposium on Power Semiconductor Devices & ICs摘要信息解释研究了什么文章的创新点文章的研究方法文章的结论 标题&am…...
【数据结构与算法——TypeScript】树结构Tree
【数据结构与算法——TypeScript】 树结构(Tree) 认识树结构以及特性 什么是树? 🌲 真实的树:相信每个人对现实生活中的树都会非常熟悉 🌲 我们来看一下树有什么特点? ▫️ 树通常有一个根。连接着根的是树干。 ▫️ 树干到…...
多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测
多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测; 2.运行环境为Matlab20…...
Shell 编程基础01
0:目录 1.创建新的虚拟机项目 2.linux常见命令和配置时间同步器 3.文件属性 4.if for while和方法 1.创建新的虚拟机项目 默认下一步到虚拟机命名 默认下一步设置磁盘大小 自定义硬件 删除打印机设置映像地址 启动虚拟机 选择 install centOS 7 选择英文 设置时…...
Cross-Site Scripting
文章目录 反射型xss(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss-盲打xss-过滤xss之htmlspecialcharsxss之href输出xss之js输出 反射型xss(get) <script>alert("123")</script>修改maxlength的值 反射型xss(post) 账号admin密码123456直接登录 …...
基于java企业员工绩效考评系统设计与实现
摘 要 时代的变化速度实在超出人类的所料,21世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器,比人类的脑袋要灵光无数倍,什么…...
SpringBoot 操作Redis、创建Redis文件夹、遍历Redis文件夹
文章目录 前言依赖连接 RedisRedis 配置文件Redis 工具类操作 Redis创建 Redis 文件夹查询数据遍历 Redis 文件夹 前言 Redis 是一种高性能的键值存储数据库,支持网络、可基于内存亦可持久化的日志型,而 Spring Boot 是一个简化了开发过程的 Java 框架。…...
c++11 标准模板(STL)(std::basic_stringbuf)(六)
定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbu…...
iceberg系列之 hadoop catalog 小文件合并实战
背景 flink1.15 hadoop3.0pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
