【Spring系列篇--关于IOC的详解】

目录

面试经典题目:

1. 什么是spring?你对Spring的理解?简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2.什么是IoC?你对IoC的理解?IoC的重要性?将实例化对象的权利从程序员手上交到spring容器控制

3.IoC的三种注入方式( 1、set注入 2、构造注入 3、自动装配)

3.1构造方法注入构造函数注入:通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

4.Spring与web容器的整合 Spring与web容器的整合过程

5.总结


前言:

今天小编给大家带来一个开源框架的知识学习。希望你们看完我的这篇文章可以将提升你的一个开发的能力!

面试经典题目:


1. 什么是spring?你对Spring的理解?
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

  Spring框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。它由Rod Johnson创建,去搜索了它的资料很难想象Rod Johnson之前是学音乐。该框架的一些核心功能理论上可用于任何 Java 应用,它还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了 企业级JavaBeans(EJB)模型。
 

目的:解决企业应用开发的复杂性

   功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

   如下图(Spring所包含的功能):

关于IoC,AoP介绍

控制反转(IoC):Spring通过IoC容器管理应用程序中的对象依赖关系。它将对象的创建、组装和管理工作交给了容器,开发人员只需要关注业务逻辑的实现。

面向切面编程(AOP):Spring支持AOP,可以将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可重用性。
 


2.什么是IoC?你对IoC的理解?IoC的重要性?
将实例化对象的权利从程序员手上交到spring容器控制

好处:使得横切逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

例如:完成的需求:给客户添加一个文件上传的接口,实现文件上传的功能,  客户在使用了之后,觉得上传文件的速度太慢了,要求提升该功能的性能,我们使用了IoC就可以方便我们的需求添加,更改了。

3.IoC的三种注入方式( 1、set注入 2、构造注入 3、自动装配

3.1构造方法注入
构造函数注入:通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

代码演示:

package com.lya.ioc;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:42
 *
 * 用户更改信息的接口
 */
public interface UserService {
    public void update();
}

实现类:

package com.lya.ioc.service.impl;

import com.lya.ioc.UserService;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:44
 */
public class UserServiceImpl1 implements UserService {
    public void update() {
        System.out.println("更改个人信息");

//        System.out.println("上传头像功能");
    }
}

编写控制器(action)进行调用并编写无参和有参构造方法

package web;

import com.lya.ioc.UserService;
import com.lya.ioc.service.impl.UserServiceImpl1;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-15:19
 */
public class UserAction {
    private UserService userService = new UserServiceImpl1();
    public String update(){
        userService.update();
        return "list";
    }
}

定义Bean:在spring.xml文件中,可以使用XML配置元素来定义应用程序中的Bean对象。通过配置Bean的类路径、构造函数,Spring容器可以根据配置文件中的定义来创建和管理Bean对象。

配置依赖注入:spring.xml文件可以指定Bean之间的依赖关系,通过配置构造函数注入,将依赖的Bean (userService) 注入到目标Bean (userAction) 中,实现依赖注入。这样可以实现对象之间的解耦,提高代码的灵活性和可测试性。

<?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">
 
    <bean class="com.ycxw.ioc.web.UserAction" id="userAction">
        <constructor-arg name="userService" ref="userService"></constructor-arg>
    </bean>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

3.2 setter方法注入
通过setter方法来注入依赖对象。在类中定义相应的setter方法,并在容器中配置时使用相应的属性或标签指定依赖对象。当创建对象实例后,容器会调用相应的setter方法,将依赖对象注入到对象中。

示例代码:

1. 修改了控制器(action)

public class UserAction {
	private UserService userService;
	private String uname;
	private int age;
	private List<String> hobby;

	public void test2() {
		System.out.println(this.uname);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}

	public UserAction(String uname, int age) {
		super();
		this.uname = uname;
		this.age = age;
	}

	public UserAction() {
		super();
	}

2. 修改了bean注入的方式 (property)

<?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">
 
    <bean class="com.ycxw.ioc.web.UserAction" id="userAction">
     <property name="userService" ref="userService"></property>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

3.3 接口注入(自动分配)
三、这里请注意byType 和 byName 的区别:

1. byType(按类型自动装配):

在byType模式下,Spring容器会根据属性的类型来查找与之匹配的Bean,并将其自动注入到对应的属性上。
例如,如果一个属性的类型为userService,Spring容器会查找实现了userService接口的Bean,并将其注入到该属性上。
要使用byType模式,目标Bean的属性类型必须与其他Bean的类型匹配,并且在容器中只能有一个匹配的Bean。

2. byName(按名称自动装配):

在byName模式下,Spring容器会根据属性的名称来查找与之匹配的Bean,并将其自动注入到对应的属性上。
例如,如果一个属性名为myBean,Spring容器会查找名称为myBean的Bean,并将其注入到该属性上。
要使用byName模式,目标Bean的属性名称必须与其他Bean的名称匹配。
 


 

4.Spring与web容器的整合
 Spring与web容器的整合过程

 Why: 建模的过程是十分耗时的
 解决问题:
         1、建模必不可少
         2、建模要保证只执行一次
         3、建模后期望在在每一个servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext

  How:
         1、监听器的初始化方法
         2、Spring的上下文 要存放在tomacat上下文中
DemoServlet :

package com.lya.ioc.demo;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
 
 
@WebServlet("/springDemo")
public class DemoServlet extends HttpServlet{
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		ClassPathXmlApplicationContext context =(ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
		UserAction userAction = (UserAction) context.getBean("userAction");
		userAction.list();
		
		
		super.service(req, res);
	}
}

配置监听

package com.lya.ioc.listener;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
public class SpringLoadListener implements ServletContextListener{
 
	@Override
	public void contextInitialized(ServletContextEvent sce) {
System.out.println("初始化......");
		//	拿到Spring的上下文
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
//		将Spring上文保存到Tomcat上下文中
		ServletContext servletContext=sce.getServletContext();
		servletContext.setAttribute("springContext", context);
	
	
	}
	
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
 
<listener>
	<listener-class>com.ycx.ioc.listener.SpringLoadListener</listener-class>
</listener>
 
</web-app>

5.总结


1、Spring的作用
       它是一个容器框架        用来整合其他的第三方框架

        有两大核心组件:IOC和aop

2、IOC的作用
        特点:依赖注入、控制反转

        控制反转:将创建对象的权利,由程序员手动new对象的权利交给Spring容器

        优点:便于维护,拥抱变化

3、依赖注入的方式
        set注入

        构造注入

        自动装配

4、自动装配
        byName:根据bean的id在Spring的上下文进行寻找

        byType:根据属性接口在Spring上下文找对应的接口实现类

5、Spring与web整合

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

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

相关文章

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 根据业务需求将不同的法律法规&#xff0c;展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色&#xff0c;这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…

自动驾驶仿真:基于Carsim开发的加速度请求模型

文章目录 前言一、加速度输出变量问题澄清二、配置Carsim动力学模型三、配置Carsim驾驶员模型四、添加VS Command代码五、Run Control联合仿真六、加速度模型效果验证 前言 1、自动驾驶行业中&#xff0c;算法端对于纵向控制的功能预留接口基本都是加速度&#xff0c;我们需要…

git环境超详细配置说明

一&#xff0c;简介 在git工具安装完成之后&#xff0c;需要设置一下常用的配置&#xff0c;如邮箱&#xff0c;缩写&#xff0c;以及git commit模板等等。本文就来详细介绍些各个配置如何操作&#xff0c;供参考。 二&#xff0c;配置步骤 2.1 查看当前git的配置 git conf…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展&#xff0c;我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展&#xff0c;人们对其管理的要求也不断提高&#xff0c;都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

剪枝基础与实战(3): 模型剪枝和稀疏化训练流程

Model Pruning 相关论文:Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017) 考虑一个问题,深度学习模型里面的卷积层出来之后的特征有非常多,这里面会不会存在一些没有价值的特征及其相关的连接?又如何去判断一个特征及其连接是否有价值? …

redis实战-缓存数据解决缓存与数据库数据一致性

缓存的定义 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪&#xff0c;这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存…

【汇编语言】使用DS和[address]实现字的传送

文章目录 要解决的问题&#xff1a;CPU从内存单元中读取数据字的传送 要解决的问题&#xff1a;CPU从内存单元中读取数据 1、要求&#xff1a;CPU要读取一个内存单元时&#xff0c;必须先给出这个内存单元的地址&#xff1b; 2、原理&#xff1a;8086设备中&#xff0c;内存地…

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…

git压缩/合并多次commit提交为1次commit提交

git压缩/合并N次commit提交为1次commit提交 假设有最近3次提交&#xff1a; commit_id1 commit_id2 commit_id3目标是把以上3次commit合并成1个commit&#xff0c;注意&#xff0c;最新的commit提交在最上面。 在git bash里面的操作步骤&#xff1a; &#xff08;1&#xff0…

【周末闲谈】关于“数据库”你又知道多少?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言数据库数据库的五大特点数据库介绍数据库管理系统&a…

Oracle故障案例之-19C时区补丁DSTV38更新

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…

2023国赛数学建模E题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 API 介绍

文章目录 一、RKNN 初始化及对象释放二、RKNN 模型配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN-Toolkit2 API 详细说明。 一、RKNN 初始化及对象释放 在使用 RKNN Toolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,…

图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…

工作6年了日期时间格式化还在写YYYY疯狂给队友埋雷

前言 哈喽小伙伴们好久不见&#xff0c;今天来个有意思的雷&#xff0c;看你有没有埋过。 正文 不多说废话&#xff0c;公司最近来了个外地回来的小伙伴&#xff0c;在广州工作过6年&#xff0c;也是一名挺有经验的开发。 他提交的代码被小组长发现有问题&#xff0c;给打回了&…

【C语言练习】数组OJ题

目录 一.消失的数字思路1&#xff1a;思路2&#xff1a; 二.移除元素三.轮转数组四.删除有序数组中的重复项五.合并两个有序数组 一.消失的数字 题目&#xff1a; 思路1&#xff1a; 数组是从0加到N&#xff0c;所以把0到N的数加起来减去数组中的值&#xff0c;结果就是消失…

文心一言最新重磅发布!

8月16日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023举办。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰以《大语言模型为通用人工智能带来曙光》为题&#xff0c;阐述了大语言模型具备理解、生成、逻辑、记忆…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础&#xff0c;对 FreeRTOS 中时间片的概念作了解释&#xff0c;并且给出了实现方式&#xff0c;同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中&#xff0c;我们已经知道任务根据不同的优先级被放入就绪列表中不…