spring day 1021

ok了家人们,这周学习spring框架,我们一起去看看吧

Spring

.Spring概述

1.1 Spring介绍

官网: https://spring.io/
广义的 Spring Spring 技术栈 (全家桶)
广义上的 Spring 泛指以 Spring Framework 为基础的 Spring
技术栈。
经过十多年的发展, Spring 已经不再是一个单纯的应用框
架,而是逐渐发展成为一个由多个不同子项目(模块)组成的
成熟技术,例如 Spring Framework Spring MVC
SpringBoot Spring Cloud Spring Data Spring Security
等,其中 Spring Framework 是其他子项目的基础。
狭义的 Spring Spring Framework (基础框架)
狭义的 Spring 特指 Spring Framework ,通常我们将它称为
Spring 框架。
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框
架,以 IoC Inverse Of Control :反转控制)和 AOP
Aspect Oriented Programming :面向切面编程)为内
核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业
务层事务管理等众多的企业级应用技术,还能整合开源世界众
多著名的第三方框架和类库,逐渐成为使用最多的 Java EE
业应用开源框架。

1.2 spring 的优势

  • 方便解耦,简化开发
通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由
Spring 进行控制,避免硬编码所造成的过度程序耦合。用户
也不必再为单例模式类、属性文件解析等这些很底层的需求编
写代码,可以更专注于上层的应用。
  • AOP 编程的支持

通过 Spring AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。

  • 声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明
式方式灵活的进行事务的管理,提高开发效率和质量。
  • 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试
不再是昂贵的操作,而是随手可做的事情。
  • 方便集成各种优秀框架
Spring 可以降低各种框架的使用难度,提供了对各种优秀框
架( Struts Hibernate Hessian Quartz 等)的直接支
持。
  • 降低 JavaEE API 的使用难度
Spring JavaEE API (如 JDBC JavaMail 、远程调用等)进
行了薄薄的封装层,使这些 API 的使用难度大为降低。

1.3 spring 的体系结构

.优质程序代码的书写原

2.1 耦合与内聚

耦合( Coupling ):代码书写过程中所使用技术的结合紧
密度 ( 程序之间的依赖程度 ) ,用于衡量软件中各个模块之间
的互联程度;
内聚( Cohesion ):代码书写过程中单个模块内部各组成
部分间的联系,用于衡量软件中各个功能模块内部的功能
联系;
程序书写的目标:高内聚,低耦合。就是同一个模块内的
各个元素之间要高度紧密,但是各个模块之间的相互依存
度却不要那么紧密

2.2 耦合和内聚代码示例

//内聚:一个方法只做一件事情(一个类只聚合一个业务属性
集)
//反例: 此方法不符合高内聚思想
public int compute(int i,int j,String label){
if("+".equals(label)){
return i+j;
}else if("-".equals(label)){
return i-j;
}else{
//do something....
}
}
//例子:
public int add(int i,int j){
return i+j;
}
public int sub(int i,int j){
return i-j;
}
//耦合:程序代码之间的依赖关系
public class UserService(){
public List<User> getAllUser(){
/**
* getAllUser方法的执行需要依赖UserDao类,
* 我们称,getAllUser方法与UserDao类之间有
耦合
**/
UserDao userDao=new UserDao();
return userDao.findAll();
}
}
public class UserDao(){
public List<User> findAll(){
//do something and return list
}
}
耦合 : 程序代码之间的依赖关系。
低耦合 : 降低程序代码之间的依赖关系 , 从而方便维护扩展和重
用 。
解耦合 : java 程序代码中 , 耦合是不可能完全解开的 , 我们所说
" 解耦合 " 指的是解开程序编译期的耦合。

2.3 实现解耦

2.3.1 原始方案
public class UserServlet {
public static void main(String[] args) {
//要实现解耦:1.需要接口 需要多态 2.不能new实
现类对象
//UserServiceImpl01
userServiceImpl01=new UserServiceImpl01();
UserService userService=new
UserServiceImpl01();
userService.add();
}
}
public interface UserService {public void add();
}
public class UserServiceImpl01 implements
UserService{
@Override
public void add() {
System.out.println("impl01...add...");
}
}
public class UserServiceImpl02 implements
UserService{
@Override
public void add() {
System.out.println("impl02...add...");
}
}
2.3.2 使用工厂类+反射进行解耦
public class BeanFactory {
public static UserService getUserServcie(){
return new UserServiceImpl01();
}
}
public class UserServlet {
public static void main(String[] args) {
//要实现解耦:1.需要接口 需要多态 2.不能new实
现类对象
//UserServiceImpl01
userServiceImpl01=new UserServiceImpl01();
//UserService userService=new
UserServiceImpl01();
//虽然解决了之前的耦合,但是引入的新的耦合:工厂
类和业务层存在耦合
UserService userService=
BeanFactory.getUserServcie();
userService.add();
}
}
public class BeanFactory {
// public static UserService getUserServcie()
{
// return new UserServiceImpl01();
// }
//负责创建实现类对象,不能使用new
//使用反射方式创建对象,方法接受实现类对象的全限定名
public static Object getBean(String
className){
try {
Class<?> clazz =
Class.forName(className);
return clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public class UserServlet {
public static void main(String[] args) {
//要实现解耦:1.需要接口 需要多态 2.不能new实
现类对象
//UserServiceImpl01
userServiceImpl01=new UserServiceImpl01();
//UserService userService=new
UserServiceImpl01();
//虽然解决了之前的耦合,但是引入的新的耦合:工厂
类和业务层存在耦合
//UserService userService=
BeanFactory.getUserServcie();
UserService userService= (UserService)
BeanFactory.getBean("com.lzw.service.UserService
Impl01");
userService.add();
}
}
2.3.3 使用工厂类+反射+配置文件解耦
  • 导入依赖
<dependencies>
<!--DOM4j-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
  • 编写beans.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<bean id="userService"
class="com.lzw.service.UserServiceImpl01">
</bean>
</beans>
  • 编写工厂类
public class BeanFactory {
//定义Map集合 用于存储id和实现类对象
private static Map<String,Object> map=new
HashMap<>();
//加载并解析beans.xml文件 只需要加载一次
static {
try {
//加载beans.xml配置文件
SAXReader saxReader=new SAXReader();
InputStream in =
BeanFactory.class.getClassLoader().getResourceA
sStream("beans.xml");
Document document =
saxReader.read(in);
//解析beans.xml配置文件
Element beans =
document.getRootElement();//获取根标签beans
List<Element> beanList =
beans.elements();//获取子标签bean的集合
//遍历获取每一个bean标签
for (Element bean : beanList) {
//获取id 和 class 的属性的值
String idValue =
bean.attributeValue("id");
String classValue =
bean.attributeValue("class");
//通过反射创建对象 并存储到集合中
Object obj =
Class.forName(classValue).newInstance();
map.put(idValue,obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//提供一个方法, 用于从Map集合中, 获取指定id( 接口
字符串) 所对应的value( 接口实现类对象 )
public static Object getBean(String id){
return map.get(id);
}
}
public class UserServlet {
public static void main(String[] args) {
//要实现解耦:1.需要接口 需要多态 2.不能new实
现类对象
//UserServiceImpl01
userServiceImpl01=new UserServiceImpl01();
//UserService userService=new
UserServiceImpl01();
//虽然解决了之前的耦合,但是引入的新的耦合:工厂
类和业务层存在耦合
//UserService userService=
BeanFactory.getUserServcie();
//存在硬编码问题
//UserService userService= (UserService)
BeanFactory.getBean("com.lzw.service.UserService
Impl01");
UserService userService= (UserService)
BeanFactory.getBean("userService");
userService.add();
}
}

.Spring IOC 相关概念

3.1 IOC 控制反转

IoC Inversion Of Control )控制反转, Spring 反向控制应用
程序所需要使用的外部资源;
简单说,就是把创建创建对象的权力交给 Spring 去管理。
传统方式创建对象 : new 对象 (); ( 主动创建 ) 。当前类可以选
择主动出击( new 的方式)创建对象,但是此时耦合度
高。
IOC 方式创建对象 : 找容器 ( 被动接收 ), 本质上就是一个 Map
集合。把主动式改成被动接收,由工厂对象为当前类生产
所必须的关联对象,此时降低了两个类的依赖关系。

3.2 SpringIOC容器介绍

Spring 控制的资源全部放置在 Spring 容器中,该容器称为 IOC
容器; Spring 容器中存储的对象称为 bean 对象;
降低了组件之间的耦合性: Spring IoC 容器通过依赖注入
机制,将组件之间的依赖关系削弱,减少了程序组件之间
的耦合性,使得组件更加松散地耦合。
提高了代码的可重用性和可维护性:将组件的实例化过
程、依赖关系的管理等功能交给 Spring IoC 容器处理,使
得组件代码更加模块化、可重用、更易于维护。
方便了配置和管理: Spring IoC 容器通过 XML 文件或者注
解,轻松的对组件进行配置和管理,使得组件的切换、替
换等操作更加的方便和快捷。
交给 Spring 管理的对象(组件),方可享受 Spring 框架的
其他功能( AOP, 声明式事务管理)等

3.3 SpringIOC容器接口和实现

BeanFactory 接口提供了一种高级配置机制,能够管理任
何类型的对象,它是 SpringIoC 容器标准化超接口!
ApplicationContext BeanFactory 的子接口。添加了更多
特定于企业的功能。例如更容易与 Spring AOP 功能集
ApplicationContext 容器实现类:

3.4 SpringIoC容器管理配置方式

Spring框架提供了多种配置方式:XML配置方式、注解方式和 Java配置类方式

SSM 期间,我们使用 XML+ 注解方式为主 SpringBoot 期间,
我们使用 配置类 + 注解方式为主

.基于XMLIOC环境搭

1. 创建 Maven 工程 , 添加坐标
2. 准备好接口和实现类
3. 创建 spring 的配置文件 (applicationContext.xml), 配置bean标签
4. 创建工厂对象 获得 bean 调用
  • 创建Maven工程, 添加坐标
<dependencies>
<!--导入spring的坐标spring-context,对应版
本是5.2.10.RELEASE-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcontext</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
  • 准备好接口和实现类
public interface UserService {
public void save();
}
public class UserServiceImpl implements
UserService{
@Override
public void save() {
System.out.println("service...save...");
}
}
  • 创建spring的配置文件 (applicationContext.xml), 配置bean标签

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/bea
ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.springframework.o
rg/schema/beans
http://www.springframework.org/schema/beans/spri
ng-beans.xsd">
<!--
bean标签:通过配置bean标签告诉IOC容器需要创建
的对象id属性:bean的唯一标识,方便后期获取Bean
class属性:类的全类名!
-->
<bean id="userService"
class="com.lzw.service.UserServiceImpl"></bean>
</beans>
public class DemoTest {
@Test
public void test01(){
//创建IoC容器,并读取配置文件
ApplicationContext ioc =
new
ClassPathXmlApplicationContext("applicationConte
xt.xml");
//方式1:根据id获取 没有指定类型,返回为
Object,需要类型转化!
UserService userService01 =
(UserService) ioc.getBean("userService");
userService01.save();
//方式2:根据类型获取,但是要求,同类型只能有一个
对象交给IoC容器管理
UserService userService02 =
ioc.getBean(UserService.class);
userService02.save();singleton(默认值):
含义:在 IOC 容器中,这个 bean 的对象始终为单实例
创建对象的时机:IOC 容器初始化时
prototype:
含义:这个 bean 在 IOC 容器中有多个实例
//方式3: 根据id和类型获取
UserService userService03 =
ioc.getBean("userService", UserService.class);
userService03.save();
}
}

.Bean的相关配置

5.1 Bean的基础配置

<!--
bean标签:通过配置bean标签告诉IOC容器需要创建
的对象
id属性:bean的唯一标识,方便后期获取Bean
class属性:类的全类名!
-->
<bean id="userService"
class="com.lzw.service.UserServiceImpl"></bean>

5.2 Bean的作用域

  • singleton(默认值):
    • 含义:在 IOC 容器中,这个 bean 的对象始终为单实例
    • 创建对象的时机:IOC 容器初始化时
  • prototype
    • 含义:这个 bean IOC 容器中有多个实例
      创建对象的时机:获取 bean
      如果是在 WebApplicationContext 环境下还会有另外两
      个作用域(但不常用):
  • request 
    • 含义:请求范围内有效的实例
      创建对象的时机:每次请求
  • session
    含义:会话范围内有效的实例
    创建对象的时机:每次会话
默认情况:我们全局只需要实例化一个 Bean 对象,绝大情况
我们也仅需创建一个对象!

 

<bean id="userService"
class="com.lzw.service.UserServiceImpl"
scope="singleton"></bean>
------------------------------------------------
-----------------------------------------------
public class UserServiceImpl implements
UserService{
public UserServiceImpl(){
System.out.println("无参构造方法执行
了...");
}
@Override
public void save() {
System.out.println("service...save...");
}
}
------------------------------------------------
-----------------------------------------------
public class DemoTest {
@Test
public void test01(){
//创建IoC容器,并读取配置文件;单例模式下,IOC容
器初始化后,会立即创建对象
ApplicationContext ioc =
new
ClassPathXmlApplicationContext("applicationConte
xt.xml");
UserService userService01 =
ioc.getBean("userService", UserService.class);
UserService userService02 =
ioc.getBean("userService", UserService.class);
System.out.println(userService01);
System.out.println(userService02);
}
}
<bean id="userService"
class="com.lzw.service.UserServiceImpl"
scope="prototype"></bean>
------------------------------------------------
-----------------------------------------------
public class UserServiceImpl implements
UserService{
public UserServiceImpl(){
System.out.println("无参构造方法执行
了...");
}
@Override
public void save() {
System.out.println("service...save...");
}
}
------------------------------------------------
-----------------------------------------------
@Test
public void test01(){
//创建IoC容器,并读取配置文件,
ApplicationContext ioc =
new
ClassPathXmlApplicationContext("applicationConte
xt.xml");
UserService userService01 =
ioc.getBean("userService", UserService.class);
UserService userService02 =
ioc.getBean("userService", UserService.class);
System.out.println(userService01);
System.out.println(userService02);
}

ok了家人们,明天见

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

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

相关文章

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

在VMware上创建虚拟机以及安装Linux操作系统,使用ssh进行远程连接VMware安装注意点 (包含 v1,v8两张网卡如果没有的解决办法)

一&#xff0c;VMware上创建虚拟机 1.VMware下载 1&#xff09;点击VMware官网进入官网 网址:VMware by Broadcom - Cloud Computing for the EnterpriseOptimize cloud infrastructure with VMware for app platforms, private cloud, edge, networking, and security.https…

NAT工作原理详解:网络地址转换的关键角色

NAT工作原理详解&#xff1a;网络地址转换的关键角色 在现代计算机网络中&#xff0c;网络地址转换&#xff08;NAT&#xff09;扮演着至关重要的角色。它不仅仅是简单地将私有IP地址转换为公共IP地址&#xff0c;而是在多个方面保证了网络的正常运行和安全性。本文将详细讲解…

从网络请求到Excel:自动化数据抓取和保存的完整指南

背景介绍 在投资和财经领域&#xff0c;论坛一直是投资者们讨论和分享信息的重要平台&#xff0c;而东方财富股吧作为中国最大的财经论坛之一&#xff0c;聚集了大量投资者实时交流股票信息。对于投资者来说&#xff0c;自动化地采集这些发帖信息&#xff0c;并进行分析&#…

Maven私服架构

目录 1.maven私服介绍 1.1 私服介绍 1.2 Nexus介绍 2. maven私服实战 2.1 nexus安装 2.2 nexus仓库类型 2.3 将项目发布到私服 2.4 从私服下载jar包 2.5 将第三方jar包发布到私服 1.maven私服介绍 1.1 私服介绍 正式开发时&#xff0c;不同的项目组开发不同的工程。m…

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1&#xff09;one-stage单阶段检测 模型指标介绍&#xff1a; 2&#xff09;two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…

一文2500字从0到1实现压测自动化!

大家好&#xff0c;我是小码哥&#xff0c;最近工作有点忙&#xff0c;一直在实现压测自动化的功能&#xff0c;今天来分享一下实现思路 我所在的业务线现在项目比较少了&#xff0c;所以最近一个月我都没有做业务测试&#xff0c;需求开发完后RD直接走免测就上线&#xff0c;…

手机ip切换成全局模式怎么弄

在当今数字化时代&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开它的陪伴。随着网络技术的不断发展&#xff0c;手机IP地址的切换技术也逐渐走进大众视野&#xff0c;中&#xff0c;“全局模式” 作为IP切…

windows环境下vscode编写c语言连接mysql

创建一个文件夹test02 在文件夹中创建test.c文件 用vscode打开test02文件夹 自动生成tasks.json和launch.json文件&#xff0c;需要安装这里通C/C Runner插件来自动生成json文件和一些文件夹。 接下来配置mysql 本地已经安装了mysql数据库&#xff0c;此安装过程省略。 有…

java如何部署web后端服务

java如何部署web后端服务 简单记录一下&#xff0c;方便后续使用。 部署流程 1.web打包 2.关掉需要升级的运行中的服务 /microservice/hedgingcustomer-0.0.1-SNAPSHOT/conf/bin/ 执行脚本 sh shutdown.sh 3.解压文件 返回到/microservice 将升级包上传到该路径&#x…

JAVA IDEA 取消掉Warning:(22, 14) Class ‘XXXController‘ is never used 提示信息

方法一&#xff1a;代码修改 无用的方法&#xff1a; 删除对应的代码。增加该类对应的应用实现。 方法二&#xff1a;取消掉提示 找到settings—Editor—Inspections&#xff0c;搜索Unused declaration 右边的勾取消掉&#xff0c;对应的校验属性。

座舱软件开发“道与术”

脑图 仅仅个人归纳见解&#xff0c;欢迎专家莅临指导。

【CHI】CHI协议自问自答

学习CHI有一段时间了&#xff0c;如今回过头来&#xff0c;再读协议&#xff0c;一些问题做个记录。如果有错误的地方&#xff0c;欢迎指正。如果有其他的问题&#xff0c;也欢迎留言讨论。 spec&#xff1a; IHI0050F_amba_chi_architecture_spec 【持续更新ing】 目录 1. …

react18中如何实现同步的setState来实现所见即所得的效果

在react项目中&#xff0c;实现添加列表项&#xff0c;最后一项自动显示在可视区域范围&#xff01;&#xff01; 实现效果 代码实现 import { useState, useRef } from "react"; import { flushSync } from "react-dom"; function FlushSyncRef() {con…

JVM成神之路

目录 JVM入门关&#xff1a; 一&#xff1a;JVM的内存布局是咋样的&#xff1f; 二&#xff1a;方法区&#xff0c;永久代&#xff0c;元空间有什么区别&#xff1f; 三&#xff1a;常量池和字符串常量池有什么区别&#xff1f; 四&#xff1a;什么是堆溢出&#xff0c;什…

结构化系统分析,结构化系统设计(正片)

结构化分析方法&#xff1a;是面向数据流进行需求分析的方法&#xff0c;是用抽象模型的概念&#xff0c;按软件内部数据传递、变换的关系&#xff0c;自顶向下逐层分解&#xff0c;直到找到满足功能要求的所有可实现的软件为止。 数据流图&#xff08;DFD&#xff09;&#xf…

Linux系统:本机(物理主机)访问不了虚拟机中的apache服务问题的解决方案

学习目标&#xff1a; 提示&#xff1a;本文主要讲述-本机(物理主机)访问不了虚拟机中的apache服务情况下的解决方案 Linux系统&#xff1a;Ubuntu 23.04&#xff1b; 文中提到的“本机”&#xff1a;代表&#xff0c;宿主机&#xff0c;物理主机&#xff1b; 首先&#xff0c…

吴恩达深度学习笔记(7)

误差分析&#xff1a; 你运行一个算法代替人类计算&#xff0c;但是没有达到人类的效果&#xff0c;需要手动检查算法中的错误&#xff0c;对模型的一些部分做相应调整&#xff0c;才能更好地提升分类的精度。如果不加分析去做&#xff0c;可能几个月的努力对于提升精度并没有…

旋转花键材质及运用场景

旋转花键的材质有很多种&#xff0c;其材质选择是一个涉及多方面因素的重要决策&#xff0c;‌主要取决于应用场景的具体要求&#xff0c;包括设备的运行环境、负载大小、运行速度以及所需的耐磨性和耐腐蚀性等因素。 1、碳钢&#xff1a;价格低廉、具有较好的韧性和耐磨性&…

【分享】项目开发中的计算问题

事件背景 最近也就上个月吧&#xff0c;拿到一个新的需求&#xff0c;新建一个页面&#xff0c;三个Grid联动&#xff0c;涉及很多的页面和sql以及Java计算。 简略的画个表格表示一下&#xff1a; 第一个Grid&#xff1a; 第二个Grid&#xff1a; 第三个Grid&#xff1a; 业…