Spring源码分析:List集合注入

news/2024/9/20 18:52:24

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-boot-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.4.2</spring-boot.version><spring-cloud.version>2020.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version><knife4j.version>4.1.0</knife4j.version><hutool.version>5.6.1</hutool.version><lombok.version>1.18.22</lombok.version><maven.plugin.version>2.7.8</maven.plugin.version></properties><!-- 依赖声明 --><dependencyManagement><dependencies><!-- SpringCloud 微服务 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服务 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringBoot 依赖配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--文档插件--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>${knife4j.version}</version></dependency><!-- hutool工具 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement><dependencies><!-- SpringBoot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringBoot Actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--请求参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></build></project>
View Code
EvaluationProcess 接口
package org.example.process;public interface EvaluationProcess {void process(Object object);boolean supports(Integer type);}
View Code

ConsultingEvaluationProcess 类

package org.example.process.impl;import org.example.process.EvaluationProcess;
import org.springframework.stereotype.Service;@Service
public class ConsultingEvaluationProcess implements EvaluationProcess {@Overridepublic void process(Object object) {System.out.println("ConsultingEvaluationProcess");}@Overridepublic boolean supports(Integer type) {return type == 1;}
}
View Code
DiagnoseEvaluationProcess类
package org.example.process.impl;import org.example.process.EvaluationProcess;
import org.springframework.stereotype.Service;@Service
public class DiagnoseEvaluationProcess implements EvaluationProcess {@Overridepublic void process(Object object) {System.out.println("DiagnoseEvaluationProcess");}@Overridepublic boolean supports(Integer type) {return type == 2;}
}
View Code
EvaluationService  业务类
package org.example.process;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;@Service
public class EvaluationService {//集合注入
    @Autowiredprivate List<EvaluationProcess> evaluationProcesses;private Optional<EvaluationProcess> getProcess(Integer type) {if (this.evaluationProcesses != null) {return this.evaluationProcesses.stream().filter(a -> a.supports(type)).findFirst();}return Optional.empty();}public void save() {getProcess(1).ifPresent(origin -> origin.process(null));}
}
View Code
ScanConfig 配置
package org.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("org.example.process")
public class ScanConfig {}
View Code

测试类  Test

package org.example.process;import org.example.config.ScanConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Test {public static void main(String[] args) {//纯注解ApplicationContext c1 = new AnnotationConfigApplicationContext(ScanConfig.class);EvaluationService bean = c1.getBean(EvaluationService.class);bean.save();}
}
View Code

源码分析:

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties
org.springframework.beans.factory.annotation.InjectionMetadata#inject
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject
org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver#getLazyResolutionProxyIfNecessary
org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveMultipleBeans

 

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

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

相关文章

SD安装animatediff插件

在线地址 https://gitcode.net/ranting8323/sd-webui-animatediff 在线安装安装完重启 下载animatediff专用模型和8个镜头(可选) https://huggingface.co/guoyww/animatediff/tree/main启用 Animatediff公司电脑显卡不行,很多东西做不了。更多玩法可以去b站搜一下视频

人工智能-机器学习-逻辑回归

一、逻辑回归-预测考试通过1、导入模块 # 导入模块 import pandas as pd from matplotlib import pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score ``## 2、读取数据```python # 读取数据(加载数据,加载后打…

【Linux命令学习】lsof查看打开的文件

lsof: list open files作用1:可查端口号被哪个进程占用 比如我们跑自动化,经常会遇到端口号被占用,无法启动driver lsof -i :8081lsof 输出的结果含义:fd:文件描述符的数字,通常是一个正整数。file descriptor type:文件描述符的类型,如 REG 表示普通文件,DIR 表示目…

ECU刷写流程之压缩刷写技术解析

背景在现代汽车电子技术中,ECU(电子控制单元)的软件升级是一项关键任务。为了提高数据传输的效率和安全性,压缩刷写技术应运而生。通过数据压缩传输,我们可以有效地增加带宽利用率,减少刷写工具与ECU之间的数据传输量,从而显著缩短ECU升级时间。此外,为了加强数据的安全…

利用深度循环神经网络对心电图降噪

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 我们提出了一种利用由长短期记忆 (LSTM) 单元构建的深度循环神经网络来降 噪心电图信号 (ECG) 的新方法。该网络使 用动态模型 ECG 生成的合成数据进行预训 练,并使用来自 Physionet PDB 心电图信 号数据库的真…

手机里的照片如何压缩变小?教你4个图片压缩方法

图片压缩怎么弄?有时候图片太大,会占用比较多的储存位置,而且分享需要的时间也会比较长;甚至会因为图片过大而上传失败,今天给大家分享4个手机也适用的方法,让你轻松压缩图片,简单又快速! 方法一、QQ 直接使用我们常用到的社交软件QQ来压缩图片是一个非常不错的选择! …

centos7设置固定IP

详情见链接Vmware虚拟机Linux配置固定IP地址(详细版)_虚拟机固定ip-CSDN博客