Spring 知识点

Spring

1.1 Spring 简介

1.1.1 Spring 概念

  • Spring是一个轻量级Java开发框架,最早有Rod Johnson创建
  • 为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题
  • Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发
  • 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!

spring 官网链接:Spring

spring 官网源码下载链接:Spring Framework

GitHub 下载地址:Spring源码 GitHub 下载地址

1.1.2 Spring 优点

  • Spring是一个开源的免费的框架(容器)
  • Spring是一个轻量级的、非入侵式的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持!
  • 总的来说:Spring就是一个轻量级的控制反转(IOC)和面向切面编程的框架!

1.1.3 Spring 使用的 jar 包

  • 使用 Spring 之前,需要导入两个 jar 包
  • 将以下代码粘入 maven 即可
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<!-- 这个包用于之后与 mybatis 做整合 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

1.2 IOC 理论推导

1.2.1 什么是 IOC 理论推导

  • IOC : 控制反转,将创建对象的权利交给用户
  • 是面向对象编程中的一种设计原则,是一种想法
  • 可以用来减低计算机代码之间的耦合度
  • 其中最常见的方式叫做依赖注入

1.2.2 IOC 理论推导 代码演示

  • 正常编写一个业务需要

    • UserDao接口

    • UserDaolmpl实现类

    • UserService 业务接口

    • UserServicelmpl 业务实现类

  • 例如下面所示

image-20230806123227131

  • 我们在 service 层调用 userdao 层的方法
package com.qiaoer.service;

import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;

public class UserServiceImpl implements UserSerivce{
    private UserDao userDao=new UserDaoImplMySql();
    @Override
    public void getAllUser() {
        userDao.getAllUser();
    }
}
  • 正常是这样调用的,但是这样同时存在着一个问题
  • 当我们相应 dao 层的 Oracle 实现类时,就需要修改 new 的实现类,例如这样
package com.qiaoer.service;

import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;

public class UserServiceImpl implements UserSerivce{
    private UserDao userDao=new UserDaoImplOracle();
    @Override
    public void getAllUser() {
        userDao.getAllUser();
    }
}
  • 如果有好几种实现类,那用户每次需要修改时,都需要修改源代码
  • 这里就需要利用 set 动态实现值的注入
  • 具体代码如下
package com.qiaoer.service;

import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;

public class UserServiceImpl implements UserSerivce{
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getAllUser() {
        userDao.getAllUser();
    }
}
  • 刚刚是程序控制创建和调用对象
  • 增加了 set 方法后,则是用户去选择实现,直接调用即可

1.2.3 IOC 理论推导总结

  • 在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
  • 如果程序代码量十分大,修改一次的成本代价十分昂贵!
  • 当我们使用 set 方法实现了动态的注入后
  • 之前,程序是主动创建对象!控制权在程序员手上
  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象
  • 这种思想,从本质上解决了问题,程序员不用再去管理对象的创建了
  • 系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型

1.3 IOC 容器

1.3.1 IOC 容器简介

  • IOC (Inversion of Control,控制反转) 容器是一种用于管理和组织应用程序中组件(或对象)的框架
  • 它是一种软件设计模式,旨在实现应用程序的松耦合,提高可维护性和可测试性
  • IOC 容器通过控制对象的创建、依赖解析和生命周期管理,将对象的控制权从应用程序代码转移到容器中。
  • IOC 容器是一个重要的软件设计工具,可以帮助开发者实现可维护、可扩展和可测试的应用程序

1.3.2 使用 Spring 创建对象

  • 使用 Spring 之前,优先导入 Spring 的 jar 包
  • 将以下代码复制进 maven 即可
  <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>6.0.9</version>
     </dependency>
  • 在资源文件夹 resources 下创建一个名为 applicationContext.xml 的文件

image-20230806203906900

  • 在 spring 官网找到 ioc容器的元数据

  • **在官网的 ico容器概述内可以找到 网站:Container Overview :: Spring Framework **

  • 网址: https://docs.spring.io/spring-framework/reference/core/beans/basics.html

  • 进入官网下滑找到 <beans> 标签的内容复制

image-20230806203954287

  • 或者直接复制我下方的代码
<?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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="..." class="...">
		<!-- collaborators and configuration for this bean go here -->
	</bean>

	<bean id="..." class="...">
		<!-- collaborators and configuration for this bean go here -->
	</bean>

	<!-- more bean definitions go here -->

</beans>
  • 直接将这段代码放入刚刚创建的 applicationContext.xml 文件当中

image-20230806204130891

  • 这里的 <bean></bean> 标签实际上就类似于 new 了一个对象
  • <bean> 标签的 属性 id 代表对象的对象吗
  • <bean> 标签的属性 class 则代表引用的哪个类,要加上包名
  • Spring 使用示例 (applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="hello" class="com.qiaoer.entity.Hello">
        
    </bean>
</beans>

image-20230806204457633

  • 使用 ClassPathXmlApplicationContext 对象可以获取 Spring 的上下文
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  • 括号内的构造函数参数为 applicationContext.xml 即 Spring 配置文件的路径
  • 使用 getBean(String id) 方法可以获取具体的对象,括号内的参数对应 xml 文件当中为 <bean> 标签的 id 属性
  • 示例,获取 Hello 类的对象
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
       ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");
        System.out.println(hello);
    }
}

1.3.3 使用 Spring 为对象当中的属性赋值

  • 使用 <bean> 标签内的 子标签 <property> 来赋值
  • <property> 标签语法
 <property name="属性名" value="具体值"/>
  • <property> 标签的 name 属性为对象中要赋值的属性名,value 属性是为属性赋的值
  • 使用 <property> 赋值必须在类中为属性写有对应的 get 和 set 方法来赋值和取值
  • 示例
<?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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="hello" class="com.qiaoer.entity.Hello">
        <property name="name" value="你好"/>
    </bean>
</beans>
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
       ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");
        System.out.println(hello.getName());
    }
}
  • 如果我们要给属性赋的值是一个对象的引用的话 应使用 <property> 标签的 ref 属性 而不是 value 属性
  • 示例,现在新建一个 HelloSpring 的类,该为为 Hello 类的属性

image-20230806210254128

  • 在 applicationContext.xml 当中,应事先创建好 HelloSpring 的对象,然后使用 ref 属性指向该对象的应用
  • 示例
<?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
      https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    创建 HelloSpring 对象-->
    <bean id="helloSpring" class="com.qiaoer.entity.HelloSpring"/>
    <bean id="hello" class="com.qiaoer.entity.Hello">
<!--        将该属性的引用指向 HelloSpring 对象-->
        <property name="helloSpring" ref="helloSpring"/>
    </bean>
</beans>
  • ref 属性的值为要执行对象的 id 的值
  • 这样就将 HelloSpring 对象赋给了 Hello 内的 HelloSpring 类型的属性

1.3.4 IOC 创建对象方式

  • spring 默认创建对象时会调用类的无参构造
  • 也可以通过自己给构造器赋值,来调用有参构造,主要有 3 种方式
  • 需要使用 <bean> 标签中的子标签 <constructor-arg> 来给构造器赋值
  • 实体类 Hello 示例
package com.qiaoer.entity;

public class Hello {
    private String name;
    private int age;

    public Hello(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("name:"+this.name);
        System.out.println("age:"+this.age);
    }

    public Hello(String name) {
        this.name = name;
        System.out.println("name:"+this.name);
    }

    public Hello() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

  • 1、使用下标创建

    • 示例
    <?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
          https://www.springframework.org/schema/beans/spring-beans.xsd">
     <bean id="hello" class="com.qiaoer.entity.Hello">
         <constructor-arg index="0" value="巧克力"/>
         <constructor-arg index="1" value="17"/>
     </bean>
    </beans>
    
    • 下标 0 表示构造器第一个参数 String name ,以此类推
    • 通过下标赋值不用注意顺序
    • 在创建此对象时则会直接调用有两个参数的有参构造
    import com.qiaoer.entity.Hello;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) {
           ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");
    
        }
    }
    
  • 2、使用类型创建

    • 示例
    <?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
          https://www.springframework.org/schema/beans/spring-beans.xsd">
     <bean id="hello" class="com.qiaoer.entity.Hello">
         <constructor-arg type="int" value="17"/>
         <constructor-arg type="java.lang.String" value="巧克力"/>
     </bean>
    </beans>
    
    • 通过类型赋值时,当用相同类型的参数时,需要按照参数的顺序来赋值
    • 类型赋值不建议使用,因为当有相同类型时,容易混淆
    • 基本类型的可以直接写
    • 引用类型需要加上包名
  • 3、参数名创建

    • 示例
    <?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
          https://www.springframework.org/schema/beans/spring-beans.xsd">
     <bean id="hello" class="com.qiaoer.entity.Hello">
         <constructor-arg name="age" value="17"/>
         <constructor-arg name="name" value="巧克力"/>
     </bean>
    </beans>
    
    • 使用参数名创建也不需要注意顺序
    • 直接使用参数的名字便可赋值,推荐使用

a/beans"
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd”>





- 使用参数名创建也不需要注意顺序
- 直接使用参数的名字便可赋值,推荐使用


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

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

相关文章

MapTR论文笔记

MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION 目的 传统高精地图 通过一些离线的基于 SLAM 的方法生成&#xff0c;需要复杂的流程以及高昂的维护费用。基于 bev 分割的建图方法&#xff0c;缺少向量化 实例级的信息&#xff0c;比如…

2023牛客暑期多校训练营7 I-We Love Strings (分块)

文章目录 题目大意题解参考代码 题目大意 题解 这题给定的 n n n 大小和 s i s_i si​ 的总长度有玄机。 我们发现&#xff1a; 400 2 0 2 40020^2 400202&#xff0c;对于每一组数据 n n n 的个数每增加一个&#xff0c; s i s_i si​ 的平均值就会减小。 处理相同的 l…

nginx 负载均衡

1.环境准备 我使用的说centos7的系统 1.20版本的nginx 另外还有3台虚拟机 主机&#xff1a;192.168.163.142 两台服务器&#xff1a;服务器A--192.168.163.140 服务器B---192.168.163.141 2.配置服务器A和B 找到nginx下的html目录&#xff0c;编辑其中的index.html(在此…

前端懒加载

懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分…

【Vue+Element-plus】记录后台首页多echart图静态页面

一、页面效果 二、完整代码 Index.vue <template><div><div><DateTime /><!-- {{username}} --></div><el-row :gutter"20"><el-col :span"8"><div class"grid-content bg-purple"><P…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…

Unity之ShaderGraph 节点介绍 Procedural节点

程序化 噪声Gradient Noise&#xff08;渐变或柏林噪声&#xff09;Simple Noise&#xff08;简单噪声&#xff09;Voronoi&#xff08;Voronoi 噪声&#xff09; 形状Ellipse&#xff08;椭圆形&#xff09;Polygon&#xff08;正多边形&#xff09;Rectangle&#xff08;矩形…

一位年薪40W的测试被开除,回怼的一番话,令人沉思

一位年薪40W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…

Flutter:文件读取—— video_player、chewie、image_picker、file_picker

前言 简单学习一下几个比较好用的文件读取库 video_player 简介 用于视频播放 官方文档 https://pub-web.flutter-io.cn/packages/video_player 安装 flutter pub add video_player加载网络视频 class _MyHomePageState extends State<MyHomePage> {// 控制器late…

瑞数系列及顶像二次验证LOGS

瑞数商标局药监局专利局及顶像二次验证 日期&#xff1a;20230808 瑞数信息安全是一个专注于信息安全领域的公司&#xff0c;致力于为企业和个人提供全面的信息安全解决方案。他们的主要业务包括网络安全、数据安全、应用安全、云安全等方面的服务和产品。瑞数信息安全拥有一支…

测试经理应该怎么写测试部门年终总结报告?

年终总结一般对季度、半年度或年度总结的一个整理&#xff0c;我们需要定期对工作中的内容进行定期总结和复盘。将每一次复盘中总结出来的一些收获叠加起来&#xff0c;在针对性地调整一下&#xff0c;就是一份合格的年终总结。具体可以分为如下几个步骤&#xff1a; 1.先把这…

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)

目录 AcceptThread数据结构构造函数run() SelectorThread数据结构processAcceptedConnections()select()processInterestOpsUpdateRequests() 本文开始分析 ServerCnxnFactory的工作原理&#xff0c;按照顺序我们这样分析&#xff1a; 建立连接监听读写事件处理读写就绪的事件…

Jenkins+Docker+SpringCloud微服务持续集成

JenkinsDockerSpringCloud微服务持续集成 JenkinsDockerSpringCloud持续集成流程说明SpringCloud微服务源码概述本地运行微服务本地部署微服务 Docker安装和Dockerfile制作微服务镜像Harbor镜像仓库安装及使用在Harbor创建用户和项目上传镜像到Harbor从Harbor下载镜像 微服务持…

Java中ArrayList常用方法的学习

Java中ArrayList常用方法的学习 需求分析代码实现小结Time 需求分析 ArrayList集合的常用方法学习 代码实现 java.util.ArrayList;/*** Author:LQ* Description:* Date:Created in 16:45 2023/8/9*/ public class ListTest {public static void main(String[] args) {ArrayLis…

QT QLCDNumber 使用详解

本文详细的介绍了QLCDNumber控件的各种操作&#xff0c;例如&#xff1a;新建界面、源文件、设置显示位数、设置进制、设置外观、设置小数点、设置溢出、显示事件、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;手动调整它们的位置既费时…

【源码编译并安装RocketMQ Dashboard】

【源码编译并安装RocketMQ Dashboard】 一、环境说明二、源码编译并执行三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8已经安装了RocketMQ-5.1.3 单Master集群&#xff0c;且使用Local模式部署&#xff0c;即Broker和Proxy同进程部署…

springcloud3 bus+springconfig 实现配置文件的动态刷新(了解)

一 springcloud Bus的作用 1.1 springcloud的作用 spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。 它整合了java的事件处理机制和消息中间件的功能。其中目前支持RabbitMQ和kafka 简介&#xff1a; bus实现多个服务的配置文件动态刷新。 1.2 …

Pytorch Tutorial【Chapter 3. Simple Neural Network】

Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …

网络基本概念

目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…

linux系统虚拟主机开启支持Swoole Loader扩展

特别说明&#xff1a;只是安装支持Swoole扩展&#xff0c;主机并没有安装服务端。目前支持版本php5.4-php7.2。 1、登陆主机控制面板&#xff0c;找到【远程文件下载】这个功能。 2、远程下载文件填写http://download.myhostadmin.net/vps/SwooleLoader_linux.zip 下载保存的路…