当前位置: 首页 > news >正文

1、Spring_IOC

IOC

1.概述

  • IOC:Inversion of Control 控制反转,可以让容器负责对象的创建以及销毁操作,对象在容器中叫 bean
    在这里插入图片描述

2.回顾问题

  • 问题:写了太多与业务无关的代码

    • 耦合度非常高,写了很多和业务无关的代码
    • 不利于项目的升级迭代
  • 思考的解决方案

    • 能够直接获取 mapper 接口,而不必去关心底层的获取方式

3.bean 配置

3.1.创建 spring01 项目

  • 项目结构如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ox468aeu-1692499957253)(picture/image-20221026180412182.png)]

  • 添加 Spring 依赖

    <dependencies>
    <!--        添加 spring 依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.17.RELEASE</version></dependency>
    <!--        添加 junit 依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
    <!--            <scope>test</scope>--></dependency></dependencies>
    

3.2.添加 Student 类

  • 创建空学生类

    public class Student {
    }
    

3.3.添加 Spring 配置文件

  • 添加方式如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AxTNnQW-1692499957257)(picture/image-20221026180840332.png)]

  • 开始配置 javabean

    <?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">
    <!--    配置 Student 学生类--><bean id="student" name="stu" class="cn.sycoder.domian.Student"></bean>
    </beans>
    

4.属性介绍

属性名称说明
id给 bean 起名字(定义id 不能重复)
name给 bean 起别名
class类全限定类名

4.容器创建

4.1.ClassPathXmlApplicationContext

  • 从classPath下寻找
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(context);

4.2.FileSystemXmlApplicationContext

  • 从系统文件下寻找
ApplicationContext ctx = new FileSystemXmlApplicationContext("绝对路径地址");
  • 使用 ClassPathXmlApplicationContext 获取方式会出现如下问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kjqHuNO-1692499957258)(picture/image-20221026182206916.png)]

5.从容器中获取 bean

5.1.根据id 获取

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//从容器中根据 id 获取 bean 对象
Student stu = (Student)context.getBean("student");//通过别名获取 bean 对象
Student stuByName = (Student)context.getBean("stu");
  • 注意:如果id重复会有如下问题
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBKxVpJX-1692499957259)(picture/image-20221026183925757.png)]

5.2.根据id和类型

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
final Student student = context.getBean("student", Student.class);

5.3.根据类型获取bean

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
final Student bean = context.getBean(Student.class);
  • 注意:使用类型获取的时候,一定要保证容器中只有一个 javabean 对象
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qno96Rak-1692499957261)(picture/image-20221026183708897.png)]

5.4.注意点

  • bean 的配置spring 是使用反射调用对象的无参构造器实现的。所以必须提供无参构造器,否则会出现如下错误

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xg1jELcK-1692499957262)(picture/image-20221026184148621.png)]

6.设计模式

6.1.单例模式

  • 概述:属于创建型模式,提供了创建对象的最佳方式。单例模式只能有一个单一的类

  • 懒汉式单例模式:需要用的时候,再去把对象创建出来

    public class SingleObject {//线程不安全的懒汉式单例模式private static SingleObject instance;public static SingleObject getInstance(){if(instance == null){instance =new SingleObject();}return instance;}}
    
  • 饿汉式单例模式:不管你有没有,我先创建出来

    public class SingleObjectE {//线程不安全的饿汉式单例模式private static SingleObjectE instance = new SingleObjectE();public static SingleObjectE getInstance(){return instance;}
    }
    

6.2.工厂模式

  • 概述:也是属于创建型模式,目的也是提供创建对象的最佳方式

  • 静态工厂

    public class BeanFactory {public static Student getBean() {return new Student();}public static Object getBean(String name) {if ("Student".equals(name))return new Student();else if("SingleObject".equals(name)) {return new SingleObject();}else{return new Object();}}}
    
  • 实例工厂

    public class BeanFactory {public Object getBean(){return new Student();}
    }
    

6.3.通过反射获取 xml 配置创建对象、

  • 模拟实现IOC获取对象

  • 导依赖

    <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
    </dependency>
    <dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version>
    </dependency>
    
  • 代码实现

    public class XmlCreateBean {/*** 模拟spring 容器创建 javabean* @param configName* @param id* @return*/public static Object getBean(String configName,String id){final SAXReader saxReader = new SAXReader();try {final Document dom = saxReader.read(configName);final Element element = dom.getRootElement();final List<Element> beans = element.elements("bean");//获取每一个 beanfor (Element bean : beans) {if(id.equals(bean.attributeValue("id"))){final String aClass = bean.attributeValue("class");final Class<?> clz = Class.forName(aClass);return clz.newInstance();}}} catch (Exception e) {e.printStackTrace();}return null;}
    }
    

7. bean实例化

  • bean 交给 spring 创建,底层究竟是怎么创建的?
  • 实例化 bean 三种方式:
    • 构造器(常用)
    • 静态工厂方法
    • 实例工厂方法
    • 实现 FactoryBean(常用)

1.无参构造器实例化

  • 新建 person 类,底层是通过 clz.getDeclaredClasses() 获取构造器

    public class Person {public Person(){}}
    
  • 配置 Person bean

    <bean id="person" class="cn.sycoder.domian.Person"></bean>
    
  • 从容器中获取 bean

    @Testpublic void testConstructorInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Person p = (Person) context.getBean("person");}
    
  • 修改构造器,添加参数测试,提示找不到无参构造器

    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvDyDbZO-1692517619467)(picture/image-20221027095741037.png)]

2.静态工厂方法实例化

  • 创建 clintServer 类,提供静态工厂方法

    public class ClientServer {//创建自身对象并且私有化private static ClientServer clientServer = new ClientServer();private ClientServer() {}public static ClientServer createInstance(){return clientServer;}
    }
    
  • 配置bean 的 xml

    <bean id="clientServer" class="cn.sycoder.domian.ClientServer" factory-method="createInstance"></bean>
    
  • 获取 bean

    @Testpublic void testFactoryStaticMethodInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final ClientServer bean = context.getBean(ClientServer.class);}
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eLi3vVy-1692517619469)(picture/image-20221027100822350.png)]

  • 配置关系
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-noejAEeq-1692517619470)(picture/image-20221027102210357.png)]

3.实例工厂方法实例化

  • 创建实例工厂类

    public class ClientServiceFactory {private static ClientService instance = new ClientService();private ClientServiceFactory(){}public ClientService getInstance(){return instance;}
    }public class ClientService {
    }
    
  • 配置 bean

    <!--    配置工厂--><bean id="clientFactory" class="cn.sycoder.domian.ClientServiceFactory"></bean>
    <!--    配置 clientService--><bean id="clientService" factory-bean="clientFactory" factory-method="getInstance"></bean>
    
  • 获取bean

    @Testpublic void testFactoryInstanceMethodInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final ClientService bean = context.getBean(ClientService.class);}
    
  • 配置关系

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eumHoxKB-1692517915886)(picture/image-20221027102041002.png)]

4.FactoryBean

  • 创建员工类

    public class Employee {public void check(){System.out.println("检查是否能够拿到员工类对象");}
    }
    
  • 创建员工 factory 类实现 FactoryBean

    public class EmployeeFactory implements FactoryBean<Employee> {public Employee getObject() throws Exception {System.out.println("获取 emp 对象");return new Employee();}public Class<?> getObjectType() {return Employee.class;}public boolean isSingleton() {return false;}
    }
    
  • 配置工厂类(并没有直接配置 emp 类)

    <bean id="employee" class="cn.sycoder.domian.EmployeeFactory"></bean>
    
  • 获取 emp 对象

    @Testpublic void testFactoryBeanInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final Employee emp = (Employee)context.getBean("employee");emp.check();}
    
  • 实现方法说明

    • isSingleton:如果是 true 返回单例的对象

      public boolean isSingleton() {return true;}
      
    • getObject:进行对象创建的

      public Employee getObject() throws Exception {System.out.println("获取 emp 对象");return new Employee();
      }
      

相关文章:

1、Spring_IOC

IOC 1.概述 IOC&#xff1a;Inversion of Control 控制反转&#xff0c;可以让容器负责对象的创建以及销毁操作&#xff0c;对象在容器中叫 bean 2.回顾问题 问题&#xff1a;写了太多与业务无关的代码 耦合度非常高&#xff0c;写了很多和业务无关的代码不利于项目的升级迭…...

Socks5、IP代理在爬虫开发与HTTP通信中的应用

随着互联网的不断发展&#xff0c;代理服务器成为网络工程师和数据爬虫开发者的关键工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫开发和HTTP通信中的重要作用。 1. 代理服务器&#xff1a;保障隐私与安全的中间人 代理服务器是位于客户端与目标服务器之间…...

重新认识小米

被镁光灯聚焦的企业&#xff0c;总是会被贴上各种标签。 8月14日&#xff0c;小米科技创始人雷军以“成长”为主题的年度演讲&#xff0c;刷遍社交网络。提到小米&#xff0c;你首先想到什么&#xff1f;手机发烧友、极致性价比&#xff0c;还是最年轻的500强&#xff1f; 这…...

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…...

滑块验证码-接口返回base64数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言所需包图片示例使用方法提示前言 滑动验证码在实际爬虫开发过程中会遇到很多,不同网站返回的数据也是千奇百怪。这里分享一种接口返回base64格式的情况以及处理方式 所需包 opencv-python、…...

智能文件改名,一键与上上级目录名称同步,让文件整理更加便捷

在整理文件时&#xff0c;经常会遇到需要将文件名称与上上级目录名称保持一致的情况。手动逐个修改文件名不仅费时费力&#xff0c;还容易出错。现在&#xff0c;我们为你带来了一款智能文件改名工具&#xff0c;让你能够一键将文件名称改成跟上上级目录名称一样&#xff0c;让…...

RK3399平台开发系列讲解(内核调试篇)Valgrind使用案例

🚀返回专栏总目录 文章目录 一、使用未初始化的内存案例二、内存泄露三、在内存被释放后进行读/写案例四、从已分配内存块的尾部进行读/写案例五、两次释放内存案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于…...

07_缓存预热缓存雪崩缓存击穿缓存穿透

缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候&#xff0c;直接将数据刷新到redis懒加载&#xff0c;用户访问的时候&#xff0c;第一次查询数据库&#xff0c;然后将数据写入redis 二、缓存雪崩 发生情…...

常见前端基础面试题(HTML,CSS,JS)(三)

JS 中如何进行数据类型的转换&#xff1f; 类型转换可以分为两种&#xff0c;隐性转换和显性转换 显性转换 主要分为三大类&#xff1a;数值类型、字符串类型、布尔类型 三大类的原始类型值的转换规则我就不一一列举了 数值类型&#xff08;引用类型转换&#xff09; Numbe…...

CSS(JavaEE初阶系列14)

目录 前言&#xff1a; 1.CSS是什么 1.1CSS基本语法 2.引入样式 2.1内部样式表 2.2行内样式表 2.3外部样式 3.选择器 3.1选择器的种类 3.1.1基础选择器 3.1.2复合选择器 4.常用元素属性 4.1字体属性 4.2文本属性 4.3背景属性 4.4圆角矩形 4.5元素的显示模式 4…...

学习笔记230810--get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法&#xff0c;发现没有载荷&#xff0c;ip地址也没有带查询字符串&#xff0c;数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名&#xff0c;而get方法对象方式传参的参数名是parmas 解…...

游戏找不到msvcr100.dll解决方法,常见的三种解决方法

在计算机领域&#xff0c;msvcr100.dll是一个非常重要的动态链接库文件。它是Microsoft Visual C 2010 Redistributable的一部分&#xff0c;用于支持Visual Studio 2010的开发环境。然而&#xff0c;在某些情况下&#xff0c;msvcr100.dll可能会出现问题&#xff0c;导致程序无…...

机器学习知识点总结:什么是GBDT(梯度提升树)

什么是GBDT(梯度提升树) 虽然GBDT同样由许多决策树组成&#xff0c;但它与随机森林由许多不同。 其中之一是GBDT中的树都是回归树&#xff0c;树有分类有回归&#xff0c;区分它们的方法很简单。将苹果单纯分为好与坏的是分类树&#xff0c;如果能为苹果的好坏程度打个分&…...

SpringBoot + Vue 微人事权限组管理模块 (十四)

权限组前端页面制作 权限组管理角色和菜单之间关系&#xff0c;操作员管理着用户和角色之间的关系。 英文的输入框要有个前缀&#xff0c;SpringSecurity里角色英文名需要加一个ROLE_的前缀 上代码 <div><div class"permissManaTool"><el-input pla…...

Liunx系统编程:进程信号的概念及产生方式

目录 一. 进程信号概述 1.1 生活中的信号 1.2 进程信号 1.3 信号的查看 二. 信号发送的本质 三. 信号产生的四种方式 3.1 按键产生信号 3.2 通过系统接口发送信号 3.2.1 kill -- 向指定进程发送信号 3.2.2 raise -- 当自身发送信号 3.2.3 abort -- 向自身发送进程终止…...

宝塔端口监听不到端口

场景&#xff1a; 两个服务器同时在安装nginx 出问题导致20011没有在监听&#xff0c;重新删除nginx 就行了 当时一直以为是安全组没有放过端口&#xff0c;其实是没有监听 排查问题 php -S 0.0.0.0:端口 如果可以访问说明链接可以到服务器只是nginx没监听 sudo netstat …...

机器学习入门的概念

导航 一、 人工智能&#xff0c;机器学习&#xff0c;深度学习和传统学习二、数学基础三、编程语言 如果你刚刚入门机器学习&#xff0c;会接触到了非常多的概念。比如人工智能&#xff0c;机器学习&#xff0c;深度学习&#xff0c;神机网络&#xff0c;强化学习&#xff0c;各…...

插入排序优化——超越归并排序的超级算法

插入排序及优化 插入排序算法算法讲解数据模拟代码 优化思路一、二分查找二、copy函数 优化后代码算法的用途题目&#xff1a;数星星&#xff08;POJ2352 star&#xff09;输入输出格式输入格式&#xff1a;输出格式 输入输出样例输入样例输出样例 题目讲解步骤如下AC 代码 插入…...

面试之快速学习STL-容器适配器

1. 容器适配器 简单的理解容器适配器&#xff0c;其就是将不适用的序列式容器&#xff08;包括 vector、deque 和 list&#xff09;变得适用。 注意&#xff1a;默认使用的基础容器不代表一定只能用它&#xff0c;比如queue可以用deque&#xff0c;list。 如果你希望你的qu…...

性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

本文比较了 Spring Boot 应用程序中的不同请求处理方法&#xff1a;ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。 在本文中&#xff0c;我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。 高效的请求处理在开发高性能后端…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...