当前位置: 首页 > 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;、一棵树。…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...