Spring 01 -项目管理框架Spring入门

news/2024/5/14 21:30:16/文章来源:https://blog.csdn.net/yinying293/article/details/130021453

本部分理解原理就好

Spring入门

  • 1 Spring引入
    • 1.1 原生web开发中存在的问题
  • 2 Spring
    • 2.1 Spring的概念
    • 2.2 Spring 作用
    • 2.3 Spring的组成
    • 2.4 spring的IOC底层实现原理
  • 3 Spring快速入门
    • 3.1 引入spring依赖
    • 3.2 spring的配置文件
    • 3.3 测试
  • 四、Spring的开发细节
    • 4.1 BeanFactory的类间关系
    • 4.2 getBean方法
    • 4.3 bean标签中的scope属性
    • 4.4 创建的对象三种方式
    • 4.5 创建对象的生命周期

1 Spring引入


1.1 原生web开发中存在的问题

  • 传统Web开发存在硬编码所造成的过度程序耦合(例如:Service中作为属性Dao对象)。

  • 部分Java EE API较为复杂,使用效率低(例如:JDBC开发步骤)。

  • 侵入性强,移植性差(例如:DAO实现的更换,从Connection到SqlSession)。

2 Spring

2.1 Spring的概念

  • Spring框架是一个轻量级开放源代码JavaEE应用程序一站式框架,其主要核心为IOC和AOP
    • 轻量级开放源代码
      • 开源免费,轻量级框架指的是不依赖其他的框架能独立使用 (EJB)
    • 一站式
      • 表现层 Servlet SpringMVC
      • 业务层 Service Spring在整个web项目中起到承上启下的作用
      • 数据层 JDBC SpringDataJpa
    • IOC和AOP (面试重点难点)
      • IOC(控制反转) 以前创建对象 UserDao user = new UserDao();
        • 将对象的创建交个Spring框架(容器)
        • DI(依赖注入) 即给对象属性赋值
      • AOP(面向切面)
        • 在不修改原代码的情况,对象功能进行增强 (零入侵式编程,不修改源代码的前提下)
        • 底层原理(动态代理)

2.2 Spring 作用

  • Spring是一个项目管理框架,同时也是一套Java EE解决方案。

  • Spring是众多优秀设计模式的组合(工厂、单例、代理、适配器、包装器、观察者、模板、策略)。

  • Spring并未替代现有框架产品,而是将众多框架进行有机整合,简化企业级开发,俗称"胶水框架"。

2.3 Spring的组成

Spring架构由诸多模块组成,可分类为

  • 核心技术:依赖注入,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP。
  • 测试:模拟对象,TestContext框架,Spring MVC测试,WebTestClient。
  • 数据访问:事务,DAO支持,JDBC,ORM,封送XML。
  • Spring MVC和 Spring WebFlux Web框架。
  • 集成:远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
  • 语言:Kotlin,Groovy,动态语言。

2.4 spring的IOC底层实现原理

spring的IOC底层实现原理
请添加图片描述

3 Spring快速入门

  1. 父工程pom.xml 引入spring依赖 spring-context
  2. spring的配置文件 applicationContext.xml 配置bean的信息
  3. 创建spring容器获取对象

3.1 引入spring依赖

Context包含了beans、core、context、expression

如果是只是IOC的开发,那么只需要导入Spring的四个核心就可以了

<!--  父工程记得修改打包方式-->
<packaging>pom</packaging>
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.16</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency></dependencies>

3.2 spring的配置文件

applicationContext.xml 文件配置

Spring的IOC功能就是将对象的创建交给SpringIOC容器,然后需要使用的时候直接去Spring中获取即可

<?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 id="userDao" class="com.ying.dao.impl.UserDaoImpl"/>
</beans>

3.3 测试

创建Spring容器,获取对象实例

public class SpringTest {@Testpublic void test01(){//以前:通过new的方式直接获取UserDao对象UserDao userDao = new UserDaoImpl();userDao.addUser();}@Testpublic void test02(){//现在:通过Spring容器获取UserDao对象//获取SpringIOC容器ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = ac.getBean("userDao", UserDao.class);userDao.addUser();}

四、Spring的开发细节


4.1 BeanFactory的类间关系

  • SpringIOC容器类的结构
  • 最顶层的接口 BeanFactory
  • 子接口: ApplicationContext
    • ClassPathXmlApplicationContext 针对类路径下的xml文件配置的方式
    • AnnotationConfigApplicationContext 针对纯注解式开发配置的方式
    • FileSystemXmlApplicationContext 针对系统路径下的xml文件配置的方式
  • BeanFactory 和ApplicationContext 区别
    • BeanFactory使用的懒加载的形式,对象在使用的时候才会创建
    • ApplicationContext,当程序启动的时候会直接加载配置文件创建对象 (web推荐使用)
@Test
public void test01(){//创建Spring容器对象 ApplicationContextApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");Object userDao = ac.getBean("userDao1");System.out.println(userDao);
}
@Test
public void test02(){//创建Spring容器对象 BeanFactoryResource resource = new ClassPathResource("applicationContext.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);Object userDao1 = beanFactory.getBean("userDao1");System.out.println(userDao1);
}

4.2 getBean方法

  • getBean(“对象id标识”);
  • getBean(类对象);
  • getBean(“对象id标识”,类对象);
@Test
public void  test03(){//创建Spring容器对象 ApplicationContextApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");//缺点:获取对象的时候需要强制转换//UserDao userDao = (UserDao) ac.getBean("userDao1");//userDao.addUser();//缺点:如果一个类有多个对象,则报错//UserDao userDao = ac.getBean(UserDaoImpl.class);//userDao.addUser();UserDaoImpl userDao1 = ac.getBean("userDao1", UserDaoImpl.class);UserDaoImpl userDao2 = ac.getBean("userDao2", UserDaoImpl.class);userDao1.addUser();userDao2.addUser();
}

4.3 bean标签中的scope属性

  • scope属性的取值
    • singleton :表示创建的对象是单例的(默认取值)
    • prototype :表示创建的对象是原型模型
    • 基于web
      • request :表示创建的对象再request范围内
      • session :表示创建的对象再session范围内
      • globalSession : Spring5.X弃用
<!-- 设置为单例模式(默认单例)   -->
<bean id="userDao2" class="com.ying.dao.impl.UserDaoImpl"></bean>
<!-- 设置为原型模式   -->
<bean id="userDao3" class="com.ying.dao.impl.UserDaoImpl" scope="prototype"></bean>
@Test
public void test04(){//创建Spring容器对象 ApplicationContextApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoImpl userDao3 = ac.getBean("userDao3", UserDaoImpl.class);UserDaoImpl userDao4 = ac.getBean("userDao3", UserDaoImpl.class);System.out.println(userDao3);System.out.println(userDao4);
}

4.4 创建的对象三种方式

  • 直接配置bean标签 id 对象的唯一标识 class 对象的全限定名
  • 通过静态工厂来创建对象(了解)
  • 通过非静态工厂来创建对象(了解)

静态工厂

<!--  方式二:静态工厂   class:工厂类     factory-method:静态工厂方法-->
<bean id="userDao5" class="com.ying.factory.UserDaoFactory" factory-method="getUserDao1"/>

非静态工厂

<!--  方式三:非静态工厂   factory-bean:工厂类的对象     factory-method:工厂非静态方法-->
<!-- 先创建工厂类的对象   -->
<bean id="factory" class="com.ying.factory.UserDaoFactory"></bean>
<bean id="userDao6" factory-bean="factory" factory-method="getUserDao2"></bean>
@Test
public void test05(){//创建Spring容器对象 ApplicationContextApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoImpl userDao4 = ac.getBean("userDao4", UserDaoImpl.class);System.out.println(userDao4);UserDaoImpl userDao5 = ac.getBean("userDao5", UserDaoImpl.class);System.out.println(userDao5);UserDaoImpl userDao6 = ac.getBean("userDao6", UserDaoImpl.class);System.out.println(userDao6);
}

4.5 创建对象的生命周期

  • SpringIOC容器创建Bean的生命周期
  • 当创建的实例是单例模式:
    • 当Spring容器创建的时候,对象就会被创建
    • Spring容器关闭,就会销毁类的对象
  • 当创建的实例是原型模式:
    • Spring容器创建,并不会初始化,而是什么时候使用,什么时候初始化
    • Spring容器创建,不会销毁类的对象。而是交给Java内存回收机制

属性配置

<bean id="userDao7" class="com.ying.dao.impl.UserDaoImpl" scope="prototype" init-method="init" destroy-method="destroy">
</bean>

UserDaoImpl

public class UserDaoImpl implements UserDao {@Overridepublic int addUser() {System.out.println("UserDaoImpl添加。。");return 0;}public void init(){System.out.println("UserDaoImpl对象初始化");}public void destroy(){System.out.println("UserDaoImpl对象销毁");}
}

测试

@Test
public void test06(){//创建Spring容器对象 ApplicationContextClassPathXmlApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoImpl userDao7 = ac.getBean("userDao7", UserDaoImpl.class);System.out.println(userDao7);//Spring容器关闭ac.close();
}

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

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

相关文章

android的system_server进程的启动

android的system_server进程的启动 android的system_server进程的启动的简单介绍 system_server是Zygote的fork的第一个Java进程相当于它的大儿子&#xff0c;这个进程非常重要的&#xff0c;这里这个进程提供了很多系统线程&#xff0c;提供了所有的核心的系统服务。比如&am…

mysql与redis区别

一、.redis和mysql的区别总结 &#xff08;1&#xff09;类型上 从类型上来说&#xff0c;mysql是关系型数据库&#xff0c;redis是缓存数据库 &#xff08;2&#xff09;作用上 mysql用于持久化的存储数据到硬盘&#xff0c;功能强大&#xff0c;但是速度较慢 redis用于存储使…

SQL基础查选和条件查选

写完毕业论文&#xff0c;终于有空复习sql了&#xff0c;继续学习之旅~下次不能和上次一样&#xff0c;简单的sql语句都忘记了。 1.查询结果去重 关键字 distinct select distinct university from user_profile; 2. 将查询后的列重新命名 关键字 as 关键字limit…

Linux kernel 编译 exfat.ko ntfs.ko 来支持exFat 和 NTFS 分区

项目需求想让设备支持 exFat 和 NTFS 的文件格式. 默认的内核是不支持的,因为内核要限定1.5M之内, 所以很多东西都裁剪掉了. 而且不是所有项目都有这个需求,所以就需要编译为 ko ,按需加载; 而不是才去built-in的方式. 在如下的选项找到对应的配置. 至于如何找到, 我推荐2种方式…

LE AUDIO快速了解

有BIS和CIS两种 BIS是广播的&#xff0c;不需要连接&#xff0c;只需要监听 CIS要建立连接的&#xff0c;除了ACL链路&#xff0c;还需要建立CIS链路 BIS部分 也没啥要看的&#xff0c;只需要记住3个指令就可以了 主要是HCI的3个指令 2068 206b 206e 这3个指令即可 206…

Nacos安全性探究

Nacos怎么做安全校验的&#xff1f; 以下使用nacos2.x 如上图所示&#xff0c; 可以直接访问Nacos的接口来获取用户列表。这说明Nacos的接口被爆露&#xff0c;任何情况下都可以访问&#xff0c;因此安全性得不到保障。 Nacos 使用 spring security 作为安全框架。spring sec…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取每张图像的微秒时间和FrameID(C#)

BGAPI SDK获取图像微秒级时间和FrameID Baumer工业相机Baumer工业相机FrameID技术背景一、FrameID是什么&#xff1f;二、使用BGAPI SDK获取图像微秒时间和FrameID步骤 1.获取SDK图像微秒级时间2.获取SDK图像FrameIDBaumer工业相机使用微秒级时间和FrameID保存的用处Baumer工业…

混淆矩阵Confusion Matrix(resnet34 基于 CIFAR10)

目录 1. Confusion Matrix 2. 其他的性能指标 3. example 4. 代码实现混淆矩阵 5. 测试&#xff0c;计算混淆矩阵 6. show 7. 代码 1. Confusion Matrix 混淆矩阵可以将真实标签和预测标签的结果以矩阵的形式表示出来&#xff0c;相比于之前计算的正确率acc更加的直观…

jenkins打包发布前端项目

1.配置前端nodejs打包环境 1.1安装nodejs插件 1.2配置jenkins nodejs环境 2.下载git插件(使用此插件配置通过gitlab标签拉取项目) 3.创建一个自由风格的发布项目 4.配置项目构建流程 4.1添加钉钉告警 4.2配置参数化构建 4.3配置源码管理为git拉取项目 4.4配置构建环境 4.5配置…

transform属性

CSS transform属性允许对某一个元素进行某些形变, 包括旋转&#xff0c;缩放&#xff0c;倾斜或平移等。 注意事项&#xff0c;并非所有的盒子都可以进行transform的转换,transform对于行内级非替换元素是无效的,比如对span、a元素等 常见的函数transform function有&#xf…

算法笔记:匈牙利算法

1 二部图&#xff08;二分图&#xff09; 二分图&#xff08;Bipartite graph&#xff09;是一类特殊的图&#xff0c;它可以被划分为两个部分&#xff0c;每个部分内的点互不相连。 匈牙利算法主要用来解决两个问题&#xff1a;求二分图的最大匹配数和最小点覆盖数。 2 最大匹…

[C++笔记]初步了解STL,string,迭代器

STL简介 STL(standard template libaray-标准模板库)&#xff1a; 是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包含数据结构与算法的软件框架。 是一套功能强大的 C 模板类&#xff0c;提供了通用的模板类和函数&#xff0c;这些模板…

STM32开发(十二)STM32F103 功能应用 —— NTC 温度采集

文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解&#xff08;过程中相关问题点在第五点中做解释说明&#xff09;五、知识点补充六、结果演示一、基础知识点 了解STM32 片内资源ADC。本实验是基于STM32F103开发 实现 NTC温度采集。 NTC温度采集…

3年外包离奇被裁,痛定思痛24K上岸字节跳动....

三年前&#xff0c;我刚刚从大学毕业&#xff0c;来到了一家外包公司工作。这份工作对于我来说是个好的起点&#xff0c;因为它让我接触到了真正的企业项目和实际的开发流程。但是&#xff0c;随着时间的流逝&#xff0c;我发现这份工作并没有给我带来足够的成长和挑战。 三年…

文心一言平替版ChatGLM本地部署(无需账号)!

今天用了一个超级好用的Chatgpt模型——ChatGLM&#xff0c;可以很方便的本地部署&#xff0c;而且效果嘎嘎好&#xff0c;经测试&#xff0c;效果基本可以平替内测版的文心一言。 目录 一、什么是ChatGLM&#xff1f; 二、本地部署 2.1 模型下载 2.2 模型部署 2.3 模型运…

数据结构系列13——排序(归并排序)

目录 1. 递归实现归并排序 1.1 思路 1.2 代码实现 1.3 时间复杂度和空间复杂度 2. 非递归实现归并排序 2.1 思路 2.2 代码实现 2.3 时间复杂度和空间复杂度 1. 递归实现归并排序 1.1 思路 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列…

Excel 文件 - 比如 .csv文件编码问题 转为 UTF-8 编码 方法,解决中文乱码问题 - 解决科学计数显示问题

解决 excel 文件编码问题 1、方法一&#xff1a; 有点点击 excel 文件&#xff0c;然后选择打开方式&#xff0c;选择使用 Excel 2016 软件打开 选择 工具 ——> Web 选项 这里选择 UTF-8 编码 2、方法二 wps 导出为 .csv 文件&#xff0c;然后修改 csv 文件的后缀…

Linux修改密码报错Authentication token manipulation error的终极解决方法

文章目录报错说明解决思路流程排查特殊权限有没有上锁查看根目录和关闭selinux/etc/pam.d/passwd文件/etc/pam.d/system-auth文件终极办法&#xff0c;手动定义密码passwd: Have exhausted maximum number of retries for servic、ssh用普通用户登录输入密码正确但是登录时却提…

元宇宙是什么,元宇宙虚拟会议改变会议体验

随着人类社会的发展和科技的进步&#xff0c;传统的会议方式已经无法满足现代社会的需求。为了更好地满足社会的需求&#xff0c;VR全景元宇宙虚拟会议是近年来快速崛起的新兴领域&#xff0c;其融合了虚拟现实技术和通信技术&#xff0c;为人们提供了一种全新的交流、协作和学…

【探花交友】day02—完善个人信息

目录 1、完善用户信息 1.1、阿里云OSS 1.2、百度人脸识别 1.3、保存用户信息 1.4、上传用户头像 2、用户信息管理 2.1、查询用户资料 2.2、更新用户资料 3、统一token处理 3.1、代码存在的问题 3.2、解决方案 3.3、代码实现 4、统一异常处理 4.1、解决方案 4.2、…