【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring配置开发实战详解

360全方位渗透和探究Spring配置开发实战详解

  • Spring对于配置的转折点
  • Xml配置 vs Java配置
    • Xml配置模式的优点
    • Xml配置模式的缺点
    • Java配置模式的优点
    • Java配置模式的缺点
  • Java编程配置流程
    • 配置代码案例
  • 组件注入
    • Bean注解
      • 配置自动扫描包路径和规则
        • @Filter常用的拦截类型
        • FilterType.ASSIGNABLE_TYPE的过滤实现
        • FilterType.ANNOTATION的过滤实现
        • FilterType.ANNOTATION的过滤实现
        • FilterType.CUSTOM的过滤实现

Spring对于配置的转折点

我们都知道,Spring4在配置方式上有一个重要的变革点。在Spring4.x之前,通常使用XML配置来完成应用的基本配置,而在业务逻辑中则推荐使用注解方式。但是自从Spring4.x开始,官方推荐使用基于Java的编程配置来代替XML配置,这是一个重要的转变。

Xml配置 vs Java配置

Xml配置模式的优点

XML配置的优点在于对于老一辈程序员来说非常熟悉和简单,易于扩展,不需要重新编译就能修改应用配置参数。

Xml配置模式的缺点

XML配置的缺点是读取和解析配置文件需要耗费时间,当配置文件过多时会显得臃肿,管理起来不方便。

Java配置模式的优点

基于Java的编程配置的优点是结构更清晰,可读性更高,同时也节省了解析XML的时间。

Java配置模式的缺点

基于Java的编程配置的缺点是修改应用配置参数需要重新编译。然而,在实际的生产环境中,应用配置完成后很少会随意修改,因此这并不是一个大问题。

Java编程配置流程

在这里插入图片描述

  1. 配置类(通常命名为AppConfig),并在类名上添加@Configuration注解,这样告诉Spring这是一个配置类,类似于XML文件。

  2. 如果有外部配置文件,可以在类名上添加@PropertySource注解,并指定properties文件的路径。这样可以加载外部配置文件中的属性值。

  3. 在需要获取应用配置属性值的地方,可以在对应的变量上添加@Value注解,通过${}表达式来获取配置文件中的参数。

  4. 如果需要进行依赖注入,可以在相应的方法上添加@Bean注解,并返回对应的Bean对象。也可以使用FactoryBean来创建对应的Bean。

配置代码案例

在这个例子中,我们声明了一个配置类DataSourceConfiguration 。它使用@Configuration注解标识为配置类,@PropertySource注解引入了一个名为application.properties的外部文件,@ComponentScan配置了自动扫描的包路径。

/*** Spring 配置类* 配置数据源,事务管理,bean,自动扫描包*/
@Configuration	// 声明该类为配置类
@PropertySource({"classpath:application.properties"})	// 引入外部文件
@ComponentScan("com.example")	// 配置自动扫描包的路径
public class DataSourceConfiguration {private String DB_USERNAME;@Value("${database.password}")private String DB_PASSWORD;@Value("${database.driver}")private String DB_DRIVER;@Value("${database.jdbcUrl}")private String DB_JDBC_URL;@Bean // 数据源public DataSource dataSource() {ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setUser(DB_USERNAME);dataSource.setPassword(DB_PASSWORD);dataSource.setDriverClass(DB_DRIVER);dataSource.setJdbcUrl(DB_JDBC_URL);return dataSource;}
}

在配置类中,我们使用@Value注解来注入外部属性文件中的值。具体来说,我们注入了数据库用户名、密码、驱动和JDBC URL四个属性。

我们使用@Bean注解来定义了一个dataSource()方法,该方法返回一个数据源对象ComboPooledDataSource。在方法中,我们根据注入的属性值设置了数据源的相关属性,最终将数据源返回。

组件注入

在这里插入图片描述

  • Bean注解:Bean注解类似于XML文件中的标签,用于将一个方法或类标记为Spring容器中的一个组件。被Bean注解修饰的方法名对应标签中的id,也可以通过Bean注解的value属性设置id的值。在Spring Boot的底层代码中广泛使用。

  • 默认单实例:在Spring中,默认情况下,被注解为Bean的对象是单例的。即容器启动后会创建对象,并将其保存在容器中,以后每次使用时从容器中获取。

  • 懒加载:如果希望在需要使用时才创建对象,并将其保存在容器中以供下次使用,可以使用Lazy注解修饰对象。当使用到该对象时,容器会创建并保存,以后每次使用时都从容器中获取。

  • 多实例:如果希望每次使用时都创建一个新对象而不是使用先前创建的对象,则可以使用Scope注解。将其参数值设置为prototype,即@Scope(“prototype”)。

  • 条件注入:如果希望根据条件选择需要注入的Bean,可以使用注解Conditional进行条件判断。Spring Boot的底层代码中广泛使用该注解。

Bean注解

在这个例子中,我们使用@Bean注解来配置一个名为sampleBeanName的Bean。我们在方法名SampleBean ()上使用了@Bean注解,并将其value值设置为sampleBeanName,表示该Bean的id为sampleBeanName

@Bean(value="sampleBeanName")
public SampleBean sampleBean() {return new SampleBean ();
}

在方法内部,我们返回一个SampleBean 对象。这样,在容器启动时,会创建一个名为sampleBeanName的Bean,并将其保存在容器中,供其他组件使用。

通过这个例子,我们可以学习到如何使用@Bean注解来配置Bean,并设置Bean的id。这种方式相当于在XML文件中使用标签来配置Bean。

  1. 注解Bean的value值表示bean的id
  2. 注解Bean的value值未设置,则方法名表示bean的id

配置自动扫描包路径和规则

@Filter常用的拦截类型
  • FilterType.ANNOTATION:按照注解进行过滤
  • FilterType.ASSIGNABLE_TYPE:按照指定类型进行过滤,包括子类和实现类
  • FilterType.CUSTOM:使用自定义规则进行过滤
FilterType.ASSIGNABLE_TYPE的过滤实现

当使用FilterType.ASSIGNABLE_TYPE时,你可以根据给定的类型及其子类和实现类来进行过滤。下面是一个使用FilterType.ASSIGNABLE_TYPE的过滤实现的案例:

interface Animal {void makeSound();
}class Dog implements Animal {public void makeSound() {System.out.println("Dog barks...");}
}class Cat implements Animal {public void makeSound() {System.out.println("Cat meows...");}
}

现在,我们定义一个Filter来只扫描Animal及其子类:

import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.filter.AbstractClassTestingTypeFilter;
import org.springframework.core.type.filter.TypeFilter;public class AssignableTypeFilter implements TypeFilter {private final Class<?> targetType;public AssignableTypeFilter(Class<?> targetType) {this.targetType = targetType;}@Overridepublic boolean match(ClassMetadata metadata) {try {Class<?> clazz = Class.forName(metadata.getClassName());return targetType.isAssignableFrom(clazz);} catch (ClassNotFoundException e) {return false;}}
}

然后,在@ComponentScan注解中使用FilterType.ASSIGNABLE_TYPE过滤器:

@ComponentScan(basePackages = "com.example",includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Animal.class)})
public class MyApplication {// ...
}

在上述示例中,我们定义了一个AssignableTypeFilter类,实现了TypeFilter接口,并在match()方法中通过isAssignableFrom()方法判断待扫描的类是否是给定类型或其子类或实现类。

在@ComponentScan注解中使用@ComponentScan.Filter指定type为FilterType.ASSIGNABLE_TYPE,并将Animal类作为参数传入,这样在扫描时会过滤出Animal及其子类。

FilterType.ANNOTATION的过滤实现
@ComponentScan(value = "com.example",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class, Repository.class}),includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {CustomAnnotation.class}),useDefaultFilters = false)

在这段代码中,我们使用@ComponentScan注解来配置自动扫描的包路径和规则。

  1. 我们使用@ComponentScan注解的value属性来设置自动扫描的包路径,这里设置为"com.example"。

  2. 我们通过设置@ComponentScan注解的excludeFilters属性来排除某些类型的组件。使用@ComponentScan.Filter注解来指定需要排除的类型,其中type=ANNOTATION表示按照注解进行排除。具体的注解类如Controller、Service、Repository。

    • 同时,我们通过设置@ComponentScan注解的includeFilters属性来包含某些类型的组件。同样使用@ComponentScan.Filter注解来指定需要包含的类型,也是按照注解进行筛选。这里的例子中使用了自定义注解类CustomAnnotation。
  3. 我们通过设置@ComponentScan注解的useDefaultFilters=false来关闭Spring默认扫描全部的功能,使includeFilters生效。

FilterType.ANNOTATION的过滤实现
FilterType.CUSTOM的过滤实现

上面案例已经介绍了对应的type=ANNOTATION的案例,当使用FilterType.CUSTOM来进行过滤时,你需要自定义一个类来实现TypeFilter接口,然后根据自己的规则进行过滤。

以下是一个示例:

import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.filter.AbstractClassTestingTypeFilter;
import org.springframework.core.type.filter.TypeFilter;public class CustomFilter implements TypeFilter {@Overridepublic boolean match(ClassMetadata metadata) {// 在这里实现自定义的过滤逻辑// 返回 true 表示匹配成功,类将被扫描// 返回 false 表示匹配失败,类将被排除// 例如,只扫描带有"Service"字符串的类String className = metadata.getClassName();return className.contains("Service");}
}

然后,在@ComponentScan注解中使用自定义的过滤器:

@ComponentScan(basePackages = "com.example",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = CustomFilter.class)})
public class MyApplication {// ...
}

在上述示例中,我们定义了一个CustomFilter类,实现了TypeFilter接口,并在match()方法中实现了自定义的过滤逻辑。在这个示例中,我们只会扫描带有"Service"字符串的类,排除其他类。在@ComponentScan注解中使用@ComponentScan.Filter指定type为FilterType.CUSTOM,并将CustomFilter类作为参数传入,这样在扫描时会应用我们定义的自定义过滤器来进行过滤。

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

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

相关文章

Hadoop 视频分析系统

视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…

为什么冰酒会被视为珍品?

在某些年份&#xff0c;珍贵稀有的葡萄酒让酿酒师有了冒险的意愿&#xff0c;葡萄比平时在藤上停留更长时间&#xff0c;需要等待至少-7℃的温度&#xff0c;酿酒师需要与自然玩游戏&#xff0c;可以持续到1月&#xff0c;在罕见的情况下可以持续到2月。对于酿酒师来说&#xf…

基于鱼鹰算法的无人机航迹规划-附代码

基于鱼鹰算法的无人机航迹规划 文章目录 基于鱼鹰算法的无人机航迹规划1.鱼鹰搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鱼鹰算法来优化无人机航迹规划。 1.鱼鹰搜索算法 …

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题&#xff0c;它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中&#xff0c;我将讲述为什么自定义用户模型是如此重要以及其潜在的优势&#xff1a; 随着Web应用的不断发展&…

JS 处理文档选择和范围创建【createRange | getSelection】

介绍 1、const selection window.getSelection(); 说明&#xff1a; 1、用于获取用户当前文档选择的对象&#xff1b; 2、它返回一个 Selection 对象&#xff0c;该对象代表了用户选择的文本范围&#xff08;可以包含一个或多个范围&#xff0c;因为用户可以同时选择多个不相…

OpenAI 工程师平均薪酬 92.5 万美元;SpaceX 明年将每两天发射一次丨 RTE 开发者日报 Vol.81

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Spring Boot 中自动装配机制的原理

&#xff08;摘自mic老师面试题&#xff09; 最近一个粉丝说&#xff0c;他面试了 4 个公司&#xff0c;有三个公司问他&#xff1a;“Spring Boot 中自动装配 机制的原理” 他回答了&#xff0c;感觉没回答错误&#xff0c;但是怎么就没给 offer 呢&#xff1f; 对于这个问题…

CRM系统中的客户保留是什么意思?有多少客户可以留下来?

一家企业&#xff0c;在销售过程中有多少客户是有效的&#xff1f;又有多少客户可以留下来&#xff1f;如果企业只顾着开发新客户&#xff0c;而忽略了客户保留&#xff0c;那么将会造成资源的浪费。那么CRM系统中的客户保留是什么意思&#xff1f; 什么是客户保留&#xff1f…

Web自动化测试入门篇详解

一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&…

【广州华锐互动】影视制作VR在线学习:身临其境,提高学习效率

随着科技的不断发展&#xff0c;影视后期制作技术也在日新月异。然而&#xff0c;传统的教学方式往往难以满足学员的学习需求&#xff0c;无法充分展现影视后期制作的魅力和潜力。近年来&#xff0c;虚拟现实(VR)技术的崛起为教学领域带来了新的机遇。通过VR教学课件&#xff0…

【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存

目录 1.前言2.引入依赖3.启动类加入注解EnableCaching4.常用注解4.1CacheConfig4.2Cacheable4.3CacheEvict4.4CachePut4.5Caching 5.总结6.参考 文章所属专区 日积月累 1.前言 Spring在3.1版本&#xff0c;就提供了一条基于注解的缓存策略&#xff0c;实际使用起来还是很丝滑…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

2023软件测试必问的100个面试题【含答案】

一、测试理论 1.什么是软件测试&#xff1f; 答&#xff1a;软件测试是通过执行预定的步骤和使用指定的数据&#xff0c;以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发&#xff08;TDD&#xff09;是什么&#xff1f; 答&#xff1a;测试驱动开发是一种开…

C# 查询腾讯云直播流是否存在的API实现

应用场景 在云考试中&#xff0c;为防止作弊行为的发生&#xff0c;会在考生端部署音视频监控系统&#xff0c;当然还有考官方监控墙系统。在实际应用中&#xff0c;考生一方至少包括两路直播流&#xff1a; &#xff08;1&#xff09;前置摄像头&#xff1a;答题的设备要求使…

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…

机器人阻抗与导纳控制的区别

机器人自身的非线性动力学&#xff08;由柔软性引起的&#xff09;导致控制精度下降&#xff0c;因此难以描述准确的动力学。 导纳控制和阻抗控制都是基于位置与力关系的模式&#xff0c;被认为具有鲁棒性和安全性。然而&#xff0c;当机器人与刚体接触时&#xff0c;导纳控制常…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

农产品展示预约小程序的内容是什么

农产品可以分为多个类目&#xff0c;对农场、农产品经销商家来说&#xff0c;除了线下开店外&#xff0c;线上也同样不能放松经营&#xff0c;面对线下多种困境&#xff0c;运用线上发展可以节约人力物力成本&#xff0c;提升整体经营效率。 1、品牌传播展示难 农产品种类较多…

CentOS 7 双网卡绑定热备 —— 筑梦之路

为什么需要&#xff1f; 1. 增强网络的可靠性 2. 保障服务的可持续性 3. 降低网卡故障带来的不良影响 有哪些模式&#xff1f; 模式0&#xff1a;轮询策略&#xff08;round robin&#xff09;&#xff0c;mode0&#xff0c;优点&#xff1a;流量提高一倍缺点&#xff1a;需要接…

9种跨境电商独立站模式的特点分析和总结

在上一篇文章《什么是跨境电商独立站&#xff1f;》里&#xff0c;我们知道了什么是跨境电商独立站&#xff0c;并且知道了独立站的优势和难点&#xff0c;那么这一篇文章里面&#xff0c;我会列举出一些常见的独立站运营模式&#xff0c;分类并不严谨&#xff0c;但目的是为了…