Java 学习笔记(四)

news2024/9/20 0:15:18

@Scope

@Scope 是 Spring 框架中的一个注解,用于指定一个 bean 的作用域。在 Spring 应用程序中,bean 的作用域决定了它的生命周期和可见性。通过 @Scope 注解,你可以精确地控制 bean 的行为,以确保它在需要时存在,并在不再需要时被正确地清理。

@Scope 注解可以应用于类级别或方法级别(在使用 @Bean 注解的方法上)。它通常与 @Component、@Service、@Repository 或 @Bean 等注解一起使用,以指示 Spring 容器如何管理该 bean 的实例。

@Scope 的参数
@Scope 注解有一个主要的参数 scopeName,它指定了 bean 的作用域。Spring 提供了几种预定义的作用域,同时也允许你通过实现 Scope 接口来定义自定义作用域。

singleton(默认):每个 Spring IoC 容器中仅有一个 bean 实例,该实例被所有对该 bean 的引用共享。
prototype:每次请求 bean 时都会创建一个新的实例。
request:在 web 应用中,bean 定义在请求的范围内。即每个 HTTP 请求都会创建一个新的 bean 实例,且该实例仅在当前请求中有效。
session:在 web 应用中,bean 定义在会话的范围内。即每个 HTTP 会话都会创建一个新的 bean 实例,且该实例在该会话中共享。
application:在 web 应用中,bean 定义在 ServletContext 的范围内。即每个 web 应用仅有一个 bean 实例,该实例被所有用户共享。
websocket:在 web 应用中,bean 定义在 WebSocket 的范围内。这是 Spring 4.0 中引入的,用于支持 WebSocket 协议的 bean 作用域。
使用示例

import org.springframework.context.annotation.Scope;  
import org.springframework.stereotype.Component;  
  
@Component  
@Scope("prototype")  
public class MyPrototypeBean {  
    // 类定义  
}  
  
// 或者在配置类中定义  
  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.context.annotation.Scope;  
  
@Configuration  
public class AppConfig {  
  
    @Bean  
    @Scope("request")  
    public MyRequestBean myRequestBean() {  
        return new MyRequestBean();  
    }  
}

在上述示例中,MyPrototypeBean 被声明为原型作用域,这意味着每次从 Spring 容器中请求它时,都会获得一个新的实例。而 myRequestBean 方法定义的 bean 被声明为请求作用域,仅在当前 HTTP 请求期间有效。

自定义作用域
如果你需要定义一个自定义的作用域,你需要实现 Scope 接口并注册一个 CustomScopeConfigurer bean 来告知 Spring 关于你的新作用域。这通常涉及更复杂的配置,适用于特定的用例,如集群环境中的会话管理等。

@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true)

@ConditionalOnProperty 是 Spring Boot 提供的一个条件注解,用于根据应用程序中的配置属性(即 application.properties 或 application.yml 文件中的配置)来决定某个配置类、Bean 或自动配置类是否应该被包含进最终的 Spring 应用上下文中。这对于条件化地激活或禁用自动配置特别有用。

下面是 @ConditionalOnProperty 注解的详细参数解释,包括你提到的那个具体示例:

prefix: 指定配置属性的前缀。在你的例子中,prefix = "spring.aop" 表示我们将关注 spring.aop 开头的配置属性。
name: 指定配置属性的名称。在你的例子中,name = "auto" 表示我们将特别关注 spring.aop.auto 这个配置属性。
havingValue: 指定期望的配置属性值。在你的例子中,havingValue = "true" 表示只有当 spring.aop.auto 的值等于 true 时,
条件才成立。
matchIfMissing: 当指定的配置属性不存在时,是否认为条件成立。在你的例子中,
matchIfMissing = true 表示如果 spring.aop.auto 配置没有指定(即不存在这个配置项),则条件也被视为成立。
这常用于提供一个默认值或行为,如果配置未被明确指定。

综合上述参数,@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true) 注解的含义是:如果 spring.aop.auto 的配置值为 true,或者该配置项完全不存在(因为 matchIfMissing = true),则条件成立,标注了该注解的类、方法或Bean将被包含进Spring应用上下文中。

这种机制对于创建可选功能特别有用,尤其是当你想让用户通过简单的配置来启用或禁用某个功能时。通过使用 @ConditionalOnProperty,你可以非常灵活地控制哪些配置和Bean被包含在你的应用中,使得你的应用更加模块化和可配置。

SPI 机制

SPI(Service Provider Interface)机制是Java平台的一种服务提供者机制,它允许第三方为Java核心库或框架提供自定义的实现。这种机制通过基于接口的编程、策略模式以及配置文件的方式,实现了动态加载和替换组件的功能,从而增强了系统的可扩展性和灵活性。下面将详细介绍SPI机制在Java和SpringBoot中的使用,并给出示例代码。

SPI机制概述
SPI机制的核心思想在于解耦服务提供者和使用者,通过接口定义服务规范,而具体的实现则由不同的服务提供者提供。Java平台通过java.util.ServiceLoader类来加载和发现这些服务提供者。服务提供者需要在其jar包的META-INF/services目录下创建一个以接口全限定名命名的文件,文件内容为实现该接口的具体类的全限定名。

SPI在Java中的使用
在Java中,SPI机制主要用于扩展Java平台的能力,比如JDBC(Java Database Connectivity)通过SPI机制加载不同数据库的驱动,SLF4J(Simple Logging Facade for Java)通过SPI机制加载不同日志框架的实现等。

示例代码
以下是一个简单的Java SPI使用示例:

定义服务接口

public interface Log {  
    void log(String message);  
}

创建服务实现类

public class ConsoleLogger implements Log {  
    @Override  
    public void log(String message) {  
        System.out.println("Console Logger: " + message);  
    }  
}  
 
public class FileLogger implements Log {  
    @Override  
    public void log(String message) {  
        System.out.println("File Logger: " + message);  
    }  
}

创建配置文件

在src/main/resources/META-INF/services目录下创建名为com.example.Log的文件(假设Log接口的全限定名为com.example.Log),文件内容如下:

com.example.ConsoleLogger  
com.example.FileLogger

加载服务实现类

import java.util.ServiceLoader;  
 
public class App {  
    public static void main(String[] args) {  
        ServiceLoader<Log> serviceLoader = ServiceLoader.load(Log.class);  
        for (Log log : serviceLoader) {  
            log.log("Hello SPI");  
        }  
    }  
}

这段代码会输出:

Console Logger: Hello SPI  
File Logger: Hello SPI

SPI在SpringBoot中的使用
在SpringBoot中,SPI机制同样被广泛应用,主要用于自动注册各种组件,如自动注册插件、自动注册事件监听器、自动注册过滤器等。SpringBoot通过spring.factories文件(位于META-INF目录下)来配置SPI机制,该文件包含了SpringBoot运行时需要读取的类信息。

示例(概念性说明)
虽然SpringBoot中的SPI使用更多是通过spring.factories文件配置的,而不是直接通过ServiceLoader类加载,但背后的思想是一致的:通过接口定义服务,并通过配置文件指定实现类。SpringBoot在启动时会自动扫描spring.factories文件,并加载其中指定的类。

例如,在spring.factories文件中配置一个自定义的ApplicationListener:

org.springframework.context.ApplicationListener=com.example.MyApplicationListener

这样,SpringBoot在启动时就会自动加载并注册com.example.MyApplicationListener作为ApplicationListener的实现。

总结
SPI机制是Java平台提供的一种强大的服务提供者机制,它通过接口定义服务规范,允许第三方提供具体的实现,并通过配置文件和ServiceLoader类实现动态加载和替换。在Java和SpringBoot中,SPI机制都得到了广泛的应用,为系统的扩展性和灵活性提供了有力的支持。

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

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

相关文章

Spring3~~~

目录 多例 后置处理器BeanPostProcessor XML配置 通过注解 AOP与后置处理器 JdbcTemplate jdbc.properties jdbc.xml Test 具名参数 DAO 声明式事务 GoodsDao GoodsService xml 传播机制 种类 隔离级别 超时回滚 如果是普通的java项目&#xff0c;xml文件放…

microchip中使用printf给AVR单片机串口重定向

重定向中修改需要的串口 #ifndef USART1_H_ #define USART1_H_#ifndef F_CPU #define F_CPU 11059200UL #endif #define BAUDRATE 9600 #include <avr/io.h> #include <avr/interrupt.h>#include <stdio.h> #include <string.h>#define PRINT /*…

现在开始备考11月PMP考试,来得及吗?

根据官方发布的消息&#xff0c;11月份的PMP考试预计在11月30日举行&#xff0c;距离考试还有两个多月的时间。如果你现在开始准备&#xff0c;完全有足够的时间来备战11月的考试。如果你之前有相关经验&#xff0c;一个半月左右的时间就足够你备考了。 但如果你对PMP考试一无…

A review on rumour prediction and veracity assessment in online social network

ABSTRACT 在当今时代&#xff0c;社交网络被用作分享个人思想和观点的重要媒介。其背后的主要原因是&#xff0c;它可以轻松地在公众中快速传播信息&#xff0c;并且访问成本非常低。这导致在线社交媒体成为鼓励虚假内容并影响公众舆论及其决策的垫脚石之一。谣言是社交媒体上误…

PyRFC 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定

Asynchronous, non-blocking SAP NetWeaver RFC SDK bindings for Python. 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定 Call for Maintainers This project is currently looking for new maintainers. Please see this issue for details. Features Client …

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

play-with-docker使用指南

Play-with-Docker(PWD)是一个在线平台,提供免费的 Docker 实验环境。它允许用户在浏览器中创建和管理 Docker 容器,适合学习和实验。国内访问需要借助于魔法工具,否则可能无法访问哦。 网站地址:https://labs.play-with-docker.com/ 一、登录play-with-docker 点击页面上…

图书管理系统(面向对象的编程练习)

图书管理系统&#xff08;面向对象的编程练习&#xff09; 1.系统演示2.设计框架讲解3.代码的详细讲解3.1 多本书籍的实现3.2 不同操作人员的实现3.3 不同work操作的实现 1.系统演示 下面主要展示系统的删除图书功能和显示图书功能&#xff0c;帮助大家在开始写代码前先了解图…

秦时明月6.2魔改版+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;秦时明月。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行…

【自动化测试】常见的自动化遍历工具以及如何选择合适的自动化遍历工具

引言 自动化遍历测试通常依赖于特定的工具来实现应用的自动操作和测试 文章目录 引言一、常见的自动化遍历工具1.1 Appium1.2 Selenium1.3 Calabash1.4 Robot Framework1.5 Espresso1.6 XCTest1.7 Macaca1.8 TestComplete1.9 UiAutomator1.10 总结 二、如何选择合适的自动化遍历…

SaltStack自动化运维部署

一.什么是SaltStack SaltStack是一个服务器基础设施管理工具&#xff0c;它具有配置管理&#xff0c;远程执行&#xff0c;监控等功能&#xff0c;SaltStack由Python语言编写&#xff0c;是非常简单易用和轻量级的管理工具。 二.为什么使用SaltStack 为同时管理多台机器&…

BUUCTF-MISC-easycap

题目文件下载下来解压之后获得了一个流量包 用Wireshark打开 点击分析--追踪流--TCP--Stream 直接就获得了flag FLAG:385b87afc8671dee07550290d16a8071

乐队排练看谱软件有哪些 乐队排练编曲软件哪个好

提起乐队&#xff0c;人们想到的大多是乐队的主唱&#xff0c;乐队主唱是听众最能够直观感受到一支乐队演奏水平的部分。但是严格意义上来说&#xff0c;乐队的组成部分并不只有主唱&#xff0c;在整个乐队中除了主唱&#xff0c;恐怕吉他手或贝斯手就是最重要的组成部分了。乐…

如何看待IBM中国的裁员?

前言 IBM 作为一家全球知名的科技公司&#xff0c;在不同的历史时期都进行了不同程度的结构调整&#xff0c;包括在中国市场的裁员行动。这类事件通常反映了公司在面对全球经济环境变化和技术发展趋势时所作出的战略调整。 从宏观整体分析 1. 全球经济环境的影响 全球经济环境…

前海桂湾的海边免费停车场

​前海很多打工人晚上加班前海边散步的地方。相信很多前海打工人都曾经路过这个免费的停车场。坐标出于滨海大道的断头路区域。 看卫星地图可以发现&#xff0c;是个断头路&#xff0c;但是面积还是很大&#xff0c;停个几十辆车没问题。我就停过一次&#xff0c;周末带娃来这里…

ROS 设置dhcp option 6 多个地址格式

ROS routeOS 手工设置 dhcp 服务 option 6 多个dns 地址格式。字符串方式

erlang学习:Linux常用命令1

Linux的概念 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦&#xff08;Linus…

AI技术好书推荐:《AI系统-原理与架构》

今年1月份在B站发现了一个B站宝藏博主&#xff0c;发布的一系列AI技术类科普视频内容很干&#xff0c;逻辑清晰&#xff0c;很多知识点讲的深入浅出&#xff0c;非常有用&#xff0c;被直接种粉。 后来这一系列的课程内容博主有了出书的计划&#xff0c;机缘巧合有幸参与部分章…

今日所学啊

ArcGIS打不开焦点统计如何解决_arcgis焦点统计打不开-CSDN博客 好吧其实最后焦点统计还是不行&#xff0c;我就去ArcGIS Pro里做焦点统计了哈哈哈哈哈哈哈 visual studio多工程项目管理_visual studio 的模块管理-CSDN博客 1.今天成功#include <QNetworkReply>不画红线…

软件验收测试报告模版分享?专业软件验收测试公司推荐

在现代软件开发中&#xff0c;软件验收测试报告是开发与交付过程中的重要环节&#xff0c;它不仅是对软件产品质量的把关&#xff0c;也是确保客户满意度的关键文档。 在验收测试过程中&#xff0c;测试团队会对软件的各项功能进行全面的测试&#xff0c;识别潜在的问题并进行…