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

JavaNote_1.0.2_Spring

Spring框架定义

Spring Framework:
Spring 最初的项目,包括六大模块:DAO、ORM、AOP、JEE、WEB、CORE。控制反转和面向切面编程是它的核心功能。
Spring Boot:
一套全新的基础框架,用来快速搭建Spring应用,简化其配置和开发过程。
Spring Cloud:
Spring Cloud 是一系列分布式组件的集成框架。它基于Spring Boot为我们快速集成、搭建和部署分布式系统提供支持,包括服务发现与注册、配置管理、负载均衡、消息总线、服务熔断、服务监控等一系列组件功能。
Spring Cloud Data Flow:
基于Spring Cloud的大数据处理开发框架,为基于微服务的分布式流处理和批处理数据通道开发提供了一系列编程模型和最佳实践。
Spring Data:
Spring Data包含若干子项目,其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。
Spring Batch:
这是一个轻量级的批处理应用框架。其提供了大量可重用的组件,包括日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理等。

IoC(inverse of control:) 这是一种设计思想,我们需要自己定义对象,而是把对象的定义权交给容器,让容器管理对象之间的依赖关系。能够实现对象的创建和管理,并提供依赖注入功能的容器就是IoC容器

Spring中的Bean:
Spring要使用IoC容器来管理对象,那么其对象必然就要符合Bean规范。Bean的id只能设置一个,name可以设置多个,除了第一个名字以外都是别名alias

Bean的三类配置方式
XML配置方式
使用来定义。

注解的配置方式
Spring通过了一套注解来标注类,支持用注解的方式来配置bean。但是需要引入spring-context包。
这些注解的定义几乎完全一样,仅仅用于标识当前类的分类和用途。
@Component或者@Component(“demo1”)
标识当前类是一个普通的组件
@Repository或者@Repository(“demo1”)
标识当前类是一个MVC设计模式中持久层的组件。
@Service
主要用于标识当前类是一个MVC设计模式中业务逻辑层的组件。
@Controller
主要用于标识当前类是一个MVC设计模式中控制层的组件

通过Java类的方式来配置:
链接
使用@Configuration注解来标注Java类,并且使用@Bean注解来标注此类的方法。通过这种方式可以将此类转换成一个Bean配置类。配置包扫描后,Spring便可以通过调用这些被@Bean注解的方法,完成Bean的初始化与依赖关系。

BeanFactory 和 FactoryBean

Spring中的BeanFactory是一个接口,其定义了Spring IoC容器最基本的功能,即创建和管理Bean的最基本的方法。

Object getBean(String name) throws BeanException 根据名字或者ID查找bean定义,并且创建新的bean实例且返回其引用,或者返回已创建的bean实例(单例模式)的引用。若找不到则抛出异常。
boolean containsBean(String name) 判断容器中是否有指定名称或ID的bean配置,而非实例。
boolean isSingleton(String name) throws NoSuchBeanDefinitionException 判断指定名称或ID的bean配置是否使用单例模式
boolean isTypeMatch(String name, Class<?> targetType) 判断bean是否是targetType的子类或者实现类。 Class<?> getType(String name) 获取指定名称或ID的Bean配置类型

BeanFactory的衍生家族十分庞大,其中,DefaultListableBeanFactory是它最重要的实现类,也是最基本的、可独立使用的IoC容器,并且是大多数IoC容器的始祖。

FactoryBean是工厂类接口,用于定义如何生产一个Bean。一般情况Spring通过反射技术创建bean,并完成初始化。

ApplicationContext 与 ApplicationContextAware

ApplicationContext接口扩展自BeanFactory接口,该接口实现了BeanFactory的所有功能,并添加了事件传播、国际化、资源文件处理等功能。ClassPathXmlApplicationContext类是它的主要实现类之一,也是最常用的IoC容器之一。它通过从应用的类路径装载并解析XML配置文件来创建IoC容器。
链接

ApplicationContextAware接口用于向Spring容器中的bean注入当前容器的引用。让需要引用当前容器的bean实现此接口即可。容器会检查所有实现了ApplicationContextAware接口的bean,并调用其setApplicationContext()方法,将自己注入给他。

动态注册bean配置

ClassPathXmlApplicationContext等容器类的getBeanFactory()方法,用来返回定义在其内部的DefaultListableBeanFactory的实例。该对象可以实现bean的动态注册。除了直接调用容器的getBeanFactory()方法外,还可以让我们的bean实现BeanFactoryAware接口,让容器将DefaultListableBeanFactory对象注入给我们。

BeanDefinitionBuilder的静态方法genericBeanDefinition()被用于创建bean配置。此方法生成并返回封装bean的配置的BeanDefinition对象。可以通过此对象的addPropertyValue()和addPropertyReference()方法为其添加属性注入配置项,调用addConstructorArg()等方法用于配置构造函数的参数注入。

ApplicationListener与容器事件

Spring的IoC容器运用观察者模式实现了容器范围内的事件机制。当一个容器事件产生时,所有实现了ApplicationListener接口,且泛型类型匹配的bean都将“收到通知”。这些bean的onApplicationEvent()方法都将被调用。
Spring 容器内置了以下4种事件和自定义事件

  1. ContextRefreshedEvent:容器装载完成事件
  2. ContextClosedEvent:容器关闭事件
  3. ContextStartedEvent:容器启动事件
  4. ContextStoppedEvent:容器停止事件

通过继承ApplicationEvent类可以定义自定义事件。调用容器对象(ApplicationContext)的publishEvent(ApplicationEvent event)方法可以发布容器事件。所有监听了对应类型事件或ApplicationEvent事件的bean都将触发onApplicationEvent()事件处理方法。

Bean的基本配置
Scope属性

Scope是bean的标签属性,用来配置bean的作用域。核心选项有两个。

  • singleton:默认值,表示当前bean为单例模式。
  • prototype:表示当前bean配置为所有bean实例的原型。每次从容器中获取bean时,总是根据此原型产生一个新的实例。而且,spring在创建此实例、完成初始化动作和依赖注入后,就不再对其进行管理,也就是容器不会持有这些实例的引用。

Spring Framework的Web组件还提供了request、session、global session这三个选项,用于设置bean的生命周期范围,分别对应HTTP请求、会话和全局会话。
Spring还支持自定义bean的作用域,但并不是很实用。

parent和abstract

abstract属性是一个bool值,为true的时候,容器就不会去创建bean实例。类似于抽象类的概念。

parent属性用于指定要“继承”哪一个bean配置,这类似于继承的概念。

factory-bean 与 factory-method

在Spring中可以使用工厂模式完成bean的创建,分为静态工厂方法和非静态工厂方法两种方式。下面的配置等同于这样:TimeUnit.valueOf(“MILLISECONDS”)

<bean class="java.util.concurrent.TimeUnit" factory-method="valueOf"><constructor-arg value="MILLISECONDS">
</bean>

这是一个典型的静态工厂方法的形式。valueOf是静态方法,调用此方法返回TimeUnit.MILLISECONDS这一枚举值。
非静态方法则是通过调用工厂类的实例方法来创建bean的。链接

bean的初始化和释放

bean的init-method用于指定当前的bean初始化方法。容器会在创建bean实例后调用此方法。与之对应的是@PostConstruct
相反,destroy-method被用于指定当前bean的释放方法。容器会在释放当前bean实例,或者容器关闭的时候调用此方法。与之对应的是@PreDestroy

依赖注入

Spring支持多种形式的依赖注入,但是归纳起来可以分为属性注入参数注入(构造函数或初始化方法的参数)两种,其他形式都是两种注入的变种,工厂模式进行的注入是属性注入和FactoryBean的结合体。@Autowired的注解可以标注在成员变量上,也可以标注在setter方法上。

Setter注入:
要求被注入的属性必须有Setter方法。链接

工厂方式注入:
可以使用ListFactoryBean一工厂方式注入ArrayList和LinkedList等属性

构造器注入:
如果某个类有带参的构造函数,那么可以让spring通过调用这个构造函数来创造该类实例。

注解注入:
Spring提供了以下3个注解来实现依赖注入

@Autowired
默认根据当前属性的类型,从容器中查找匹配的bean注入。其required属性用于指定注入是不是必须的,在找不到匹配的bean时是否应抛出异常。

当用在成员变量的时候,容器可以自动为变量添加一个getter和setter。
用在setter或普通方法上时,如果该方法拥有多个入参,默认情况下,Spring会自动选择类型匹配的入参来进行注入。可以使用@Qualifier注解来标识某个入参,以用来指定要注入的bean标识符。

@Qualifier
此注解用于指定要引用的bean配置的标识符。

@Lazy
用于告诉Spring容器,首次用到对象时才“注入”,而非容器启动之时。

Spring也支持@Resource和@Inject注解来实现注入
但是 @Resource 并不是Spring注解,而是JDK自带的注解
@Autowired 只能根据类型自动匹配并且注入bean。@Resource默认按照bean标识符查找和注入。可以使用name和type属性

@Resource 只能声明在成员变量上,@Autowire也可以声明在其setter上

相关文章:

JavaNote_1.0.2_Spring

Spring框架定义 Spring Framework&#xff1a; Spring 最初的项目&#xff0c;包括六大模块&#xff1a;DAO、ORM、AOP、JEE、WEB、CORE。控制反转和面向切面编程是它的核心功能。 Spring Boot&#xff1a; 一套全新的基础框架&#xff0c;用来快速搭建Spring应用&#xff0c;…...

微服务多模块:Springboot+Security+Redis+Gateway+OpenFeign+Nacos+JWT (附源码)仅需一招,520彻底拿捏你

可能有些人会觉得这篇似曾相识&#xff0c;没错&#xff0c;这篇是由原文章进行二次开发的。 前阵子有些事情&#xff0c;但最近看到评论区说原文章最后实现的是单模块的验证&#xff0c;由于过去太久也懒得验证&#xff0c;所以重新写了一个完整的可以跑得动的一个。 OK&#…...

HNU数据结构与算法分析-作业4-图结构

1. (简答题) 【应用题】11.3 &#xff08;a&#xff09;画出所示图的相邻矩阵表示 &#xff08;b&#xff09;画出所示图的邻接表表示 &#xff08;c&#xff09;如果每一个指针需要4字节&#xff0c;每一项顶点的标号占用2字节&#xff0c;每一条边的权需要2字节&#xff0…...

AMPL IDE语法整理

文章目录 1、参数\集合和变量定义2、目标和约束的书写3、求解命令4、AMPL调用不同求解器的Options目录未完待续~ \qquad 最近再搞一些模型&#xff0c;需要用到AMPL中不同的求解器进行验证求解&#xff0c;故建立本博客&#xff0c;用于随时整理AMPL的相关语法和命令&#xff0…...

从0-1搭建支持gb28181协议搭建流媒体平台

系列文章目录 文章目录 系列文章目录前言一、搭建流程二、运行播放直播流效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/62b558f0213044f292be69da8cc29730.png)总结前言 一个基于C++开发的国标GB28181流媒体信令服务器。 采用SipServer+ZLMediaKit。可以搭建一个…...

数据结构与算法之栈: Leetcode 682. 棒球比赛 (Typescript版)

棒球比赛 https://leetcode.cn/problems/baseball-game/ 描述 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&a…...

E-office Server_v9.0 漏洞分析

漏洞简介 泛微e-office是一款标准化的协同OA办公软件&#xff0c;实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。由于泛微 E-Office 未能正确处理上传模块中输入…...

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言&#xff1a; 在学完 MySQL 和 Java 后&#xff0c;我们通常会尝试使用 Java编译器 连接 MySQL数据库&#xff0c;从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识&#xff0c;因此我把 JDBC 包的下载及导入流程&#xff0c;以及 JDBC 的使用流程…...

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…...

【Java EE 初阶】线程安全及死锁解决方案

目录 1.多线程下线程不安全的问题 1.使用多个线程对Array List集合进行添加操作并打印&#xff0c;查看结果 2.如何在多线程环境下使用线程安全的集合类 CopyOnWriteArrayList 3.多线程环境下使用队列 4.多线程环境下使用哈希表 1.HashTable线程安全 2.Concurrent Hash M…...

C语言函数大全-- _w 开头的函数(5)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wspawnl 1.1 函数说明 函数声明函数功能int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...);启动一个新的进程并运行指定的可执行文件 参数&#xff1a; mode &#xff1a; 启动命令的…...

机械大专生能学会云计算吗,完全零基础的

机械大专生能学会云计算吗&#xff0c;完全零基础的 正常来说&#xff0c;大专及以上学历都能学会云计算&#xff0c;但是会和满足就业需求是两回事哈。如果你想通过学习就业&#xff0c;就需要根据当下相关岗位的普遍技术需求以及其他方面的要求&#xff0c;来针对性的学习和提…...

腾讯云EdgeOne为什么能让客户降本增效?

随着数字化时代的来临&#xff0c;各类线上互动场景不断出现&#xff0c;并成为人们日常工作生活中的一部分。然而&#xff0c;基于互联网提供线上娱乐、线上办公、线上购物等服务的企业&#xff0c;在复杂的全球网络环境下会遇到网络延迟不稳定的情况&#xff0c;海外环境更多…...

基于粒子群算法的微网经济优化调度——附Matalb代码

目录 摘要&#xff1a; 代码主要内容&#xff1a; 研究背景&#xff1a; 微电网模型&#xff1a; 粒子群算法&#xff1a; 运行结果&#xff1a; Matlab代码分享&#xff1a; 摘要&#xff1a; 提出了一种经济与环保相协调的微电网优化调度模型&#xff0c;针对光伏电池…...

Flink入门

目录 一、Flink简介 二、为什么选择Flink 三、与传统数据处理架构相比 四、Flinik批处理数据基础代码 五、Flink流处理基础代码 一、Flink简介 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数 据流进行状态计算。 二、为什么选择Flink 流数据更…...

【Go微服务开发】gin+grpc+etcd 重构 grpc-todolist 项目

写在前面 最近稍微重构了之前写的 grpc-todolist 模块 项目地址&#xff1a;https://github.com/CocaineCong/grpc-todoList 1. 项目结构改变 与之前的目录有很大的区别 1.1 grpc_todolist 项目总体 1.1.1 改变前 grpc-todolist/ ├── api-gatway // 网关模块 ├── ta…...

单板硬件设计:存储器SD卡( NAND FLASH)

在单板设计中&#xff0c;无论是涉及到一个简易的CPU、MCU小系统或者是复杂的单板设计&#xff0c;都离不开存储器设计&#xff1a; 1、存储器介绍 存储器的分类大致可以划分如下&#xff1a; ROM和RAM指的都是半导体存储器&#xff0c;ROM在系统停止供电的时候仍然可以保持数…...

C++实现日期类Date(超详细)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…...

实验室检验系统源码,集检验业务、质量控制、报告、统计分析、两癌等模块于一体

云 LIS 系统针对区域化 LIS 而设计&#xff0c;依托底层云架构&#xff0c;将传统的 LIS 功能模块进行“云化”。 该系统是集检验业务、科室管理、质量控制、报告、统计分析、两癌等模块于一体的数据检验信息平台。通过计算机联网&#xff0c;实现各类仪器数据结果的实时自动接…...

学习RHCSA的day.03

目录 2.6 Linux系统的目录结构 2.7 目录操作命令 2.8 文件操作命令 2.6 Linux系统的目录结构 1、Linux目录结构的特点 分区加载于目录结构&#xff1a; 使用树形目录结构来组织和管理文件。整个系统只有一个位于根分区的一个根目录&#xff08;树根&#xff09;、一棵树。…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...