模拟简单的 spring component scan

 

/**
* specified characters provider
*/
package org.vic.demo.utils;

public class CommonCharacters {
	
	public static final String _DOT = ".";
	
	public static final String _BLANK = "";
	
	public static final String _SLASH_0 = "/";
	
	public static final String _SLASH_1 = "\\";
}

 简单的工具

 

package org.vic.demo.utils;

public class VStringUtils {
	
	
	
	public static boolean isNotEmpty (String string) {
		if (string != null && (!CommonCharacters._BLANK.equals(string.trim()))) {
			return true;
		}
		return false;
	}
	
}

 

 

package org.vic.demo.utils;

import java.util.Arrays;
import java.util.Collection;

public class VCollectionUtils {
	
	public static boolean isNotEmpty (Collection<?> c) {
		if (c != null && c.size() > 0) {
			return true;
		}
		return false;
	}
	
	public static<T> boolean isNotEmpty(T[] array) {
		if (array != null) {
			return isNotEmpty(Arrays.asList(array));
		} else {
			return false;
		}
	}
	
}

 

   mimic scanner

  只是一个简单的模拟,只扫描给定包路径下的类,不支持多层扫描。如果需要可以在这个基础上改一下。

  可以加一个解析传入package路径的类或者方法,把不同的配置转换成多个单独的package,这样就不用修改    这里的解析代码了。

   

package org.vic.demo.Annotation.scanner;

import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.URL;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.vic.demo.utils.CommonCharacters;
import org.vic.demo.utils.VCollectionUtils;
import org.vic.demo.utils.VStringUtils;

public class PackageScanner {
	
	private static Map<Class<?>, Set<Annotation>> map = new HashMap<>(); 
	
	private static final String _PROTOCOL_FILE = "file";
	
	private static final String _CLASS_SYMBO = ".class";
	
	private static String[] package_paths = null;
	
	private static class PackageScannerHolder {
		public static PackageScanner instance = new PackageScanner(package_paths);
	}
	
	public static PackageScanner getInstance (String... packagePaths) {
		package_paths = packagePaths;
		return PackageScannerHolder.instance;
	}
	
	private PackageScanner (String... packageNames) {
		if (VCollectionUtils.isNotEmpty(packageNames)) {
			try {
				ClassScanner(packageNames);
			} catch (ClassNotFoundException | IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	private void ClassScanner (String... packagePaths) throws IOException, ClassNotFoundException {
		for (String packagePath : packagePaths) {
			if (VStringUtils.isNotEmpty(packagePath)) {
				String path = convertPackagePath2FilePath(packagePath);
				Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(path);
				while (urls.hasMoreElements()) {
					URL url = urls.nextElement();
					if (url.getProtocol().equalsIgnoreCase(_PROTOCOL_FILE)) {
						String fileAbsolutePath = url.getFile();
						processor(fileAbsolutePath, packagePath);
					}
				}
			}
		}
	}
	
	private void processor (String absolutePath, String currentPackagePath) throws ClassNotFoundException {
		File dir = new File(absolutePath);
		File[] files = dir.listFiles();
		if (VCollectionUtils.isNotEmpty(files)) {
			for (File file : files) {
				if (file.isFile()) {
					String fileName = file.getName();
					String className = currentPackagePath + CommonCharacters._DOT + (fileName.replace(_CLASS_SYMBO, CommonCharacters._BLANK));
					Class<?> clazz = Class.forName(className);
					fix(clazz);
				}
			}
		}
	}
	
	private void fix (Class<?> clazz) {
		Set<Annotation> existingAnnotations = map.get(clazz);
		if (VCollectionUtils.isNotEmpty(existingAnnotations)) {
			return;
		}
		Annotation[] annotations = clazz.getAnnotations();
		if (VCollectionUtils.isNotEmpty(annotations)) {
			Set<Annotation> set = new LinkedHashSet<Annotation>();
			set.addAll(Arrays.asList(annotations));
			System.out.println("put class =======" + clazz.getName() + "======= to map!");
			map.put(clazz, set);
		}
	}
	
	private String convertPackagePath2FilePath (String packagePath) {
		return packagePath.replace(CommonCharacters._DOT, CommonCharacters._SLASH_0);
	}
	
}

 

 

caxa二次开发实例展示 本人有8年CAXA各产品(如电子图版、工艺图表、PDM等)二次开发经验,参与过国家电网南瑞集团、中石油、龙记集团、欧姆龙集团、港日集团、中集集团、中国五矿、方圆塑机、大连锅炉、金蝶PDM集成CAXA,TEAMCENTER集成CAXA、大连锅炉机械、中国中车等项目的开发,擅长CAXA电子图版、CAXA工艺图表的二次开发,有需要的可以联系我,电话:13169467685、13249738576 Q 阅读详情

相关推荐

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

spring boot自动装配之@ComponentScan详解

1.@ComponentScan注解作用 @ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。与ComponentScan注解相对应的XML配置就是<context:component-scan/>, 根据指定的配置自动扫描package,将符合条件的组件加入到IOC容器中; XML的配置方式如下: &l

qq_39093474的博客 1万+

常用的集成TTL门电路

本篇主要分析了常用的逻辑门电路与非门,详细分析了电源原理。值得收藏。

ManagerUser的博客 5090

spring启动component-scan类扫描加载过程

有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,...

xiaocai9999的专栏 1万+

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

多传感器标定:如何统一摄像头、雷达与IMU坐标?

多传感器标定:如何统一摄像头、雷达与IMU坐标?​ ,人工智能,计算机视觉,大模型,AI,本文详细阐述多传感器标定中统一摄像头、雷达与 IMU 坐标的方法。先介绍传感器坐标系统、坐标统一必要性及变换数学基础,再分述摄像头与雷达、IMU 与摄像头、IMU 与雷达的标定原理、步骤、参数计算及结果验证,还讲解了多传感器坐标统一的整体流程,分析了标定常见问题及解决办法,介绍了常用标定工具,结合实际案例说明应用,探讨了标定精度的影响因素、提升方法及发展趋势,为相关领域提供了全面的多传感器标定指导。​

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

@ComponentScan注解

@ComponentScan注解 推荐博客:https://blog.51cto.com/4247649/2118342 @ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中 @ComponentScan默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中...

呼卓宇的博客 7541

基于YOLO和KCF的目标跟踪算法研究

该算法结合了YOLO的目标检测能力和KCF的目标跟踪精度,能够实现准确且高效的目标跟踪。通过结合YOLO的目标检测能力和KCF的目标跟踪精度,该算法能够实现准确且高效的目标跟踪。目标跟踪:从第二帧开始,我们使用YOLO检测目标,并使用KCF跟踪器更新目标的位置。具体而言,对于每个检测到的目标,我们计算其与上一帧跟踪结果的特征相似度,然后选择最相似的目标作为当前帧的跟踪结果。需要注意的是,以上代码只是演示了基于YOLO和KCF的目标跟踪算法的基本思路,实际应用中可能需要根据具体情况进行调整和优化。

QoDeveloper的博客 1575

模拟Spring IoC(一)Component及Autowired注解

下面的文章内容是对Spring的IoC部分的简单模仿,但并不是完全一样,有很多的不足之处 依赖注入解释: IoC(Inversion of Control)即控制反转,与依赖注入DI(Dependency Injection)意义相同。 下面举个例子说明一下什么是依赖注入: public class TwoClass { public TwoClass() { } @Override public String toString() { return "这是一个TwoClass的对象"

a_un_l的博客 414

第三天:Python基础语法详解

Python代码规范与注释最佳实践 摘要: 本文深度解析Python缩进规则与代码结构的技术规范,包括缩进的底层原理、语法规则和错误处理。详细阐述Python注释系统,涵盖行内注释、文档字符串和类型注释等多种形式,并提供工业级代码组织方案。研究显示,良好的缩进可提升40%的代码识别速度,降低50%的认知负荷。文章还对比了Sphinx、pdoc等主流文档生成工具,给出企业级项目中的注释编写原则和模板建议,帮助开发者构建更可维护的Python代码。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1014

如何在 FPGA 中做数学运算

FPGA 非常适合进行数学运算,但是需要一点技巧,所以我们今天就看看如何在 FPGA 中进行简单和复杂的数学运算。介绍由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算。我们可以在 FPGA 中使用数学来实现信号处理、仪器仪表、图像处理和控制算法等一系列应用。这意味着 FPGA 可用于从自动驾驶汽车图像处理到雷达和飞机飞行控制系统的一系列应用。因为 FPGA 寄存器...

OpenFPGA的博客 2920

Spring注解context:component-scan base-package使用

小王:想要把一个bean交给Spring去管理,你想怎么做! 小李:简单啊,在Spring的配置文件里面配置<bean id="" class=""></bean>不就行了。 小王:不行啊,我们的项目太恶心了,用了一万个bean,写配置文件快累死了,密密麻麻的看不清楚 小李:额!这个也太奇葩了,怎么办,翻翻书吧,有没有好方法。 这是什么?自动装配?我擦,这么神奇?下面我们...

MyGGBond的博客 9642

“华为杯”研究生数学建模竞赛2020年-【华为杯】D题:无人机集群协同对抗(附获奖论文和MATLAB代码实现)

1.问题重述摘 要:本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。,构建了。我们综合考虑了,和。首先分析红方在集群约束下的贪婪队形和拦截策略,然后我们基于内点法联合MATLAB和AMPL编程求解蓝方突防的非线性规划解,最后基于蒙特卡洛法对整个蓝方突防过程进行推演,得到突防概率图。通过推演,我们提出了两块的区域作为所求区域,并对蓝方的最优突防策略进行分析。

getusushu的博客 1553

Spring源码深度解析(七)——简单模拟Spring类扫描过程

此文章中会简单的模拟一下Spring的scan方法,Spring底层使用的更优的扫描算法,此处就以简单的文件操作完成 实现步骤: 自定义注解作为扫描的标识,作用就同@Component作用 在Spring中是利用给配置文件中添加@ComponentScan注解,此处就直接写出basePackage,原理和第一点相同 调用方法,并打印 代码: 自定义注解Wa.java package anno;...

qq_42605968的博客 366

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring注解<context:component-scan base-package />使用

    小王:想要把一个bean交给Spring去管理,你想怎么做!     小李:简单啊,在Spring的配置文件里面配置&lt;bean id="" class=""&gt;&lt;/bean&gt;不就行了。     小王:不行啊,我们的项目太恶心了,用了一万个bean,写配置文件快累死了,密密麻麻的看不清楚     小李:额!这个也太奇葩了,怎么办,翻翻书吧,有没有好方法。  ...

wangchen2009hao的博客 461

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring <context:component-scan>标签属性 use-default-filters 以及子标签 include-filter使用说明...

Spring <context:component-scan>标签作用有很多,最基本就是 开启包扫描,可以使用@Component、@Service、@Component等注解; 今天要作为发现,记录该标签的属性 use-default-filters 以及子标签 include-filter使用方式 ; use-default-filters 默认true,默认会扫描...

aar49191的博客 415

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring为什么@Autowired注入的是接口

1.Spring怎么知道注入哪个实现?  As long as there is only a single implementation of the interface and that implementation is annotated with @Component with Spring’s component scan enabled, Spring framework can f...

zgym12138的博客 2878

模拟IOC简易扫描器

浅析xml文件中的IOC自动扫描器原理 <context:component-scan base-package="cn.scanner"/> 第一步:获取自动扫描的package的范围 base-package="cn.scanner" 第二步:获取指定范围内的包中的所有class文件 D:/java_project/week14_03_spring01/tar...

dgq4560的博客 152

SpringMVC搭建,并实现最简单的登录功能

1、首先创建一个web项目,引入相应的jar包 2、 配置web.xml文件 声明DispatchServlet,监听请求 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.s...

JackGong1999的博客 9853

【Spring框架05】Bean使用补充

UserController userController = (UserController)context.getBean(“lcy”);userController.test();}}

2401_84049061的博客 340

手写Spring 简要逻辑01 -- 启动和扫描逻辑模拟

准备:创建一个空的maven //IOC的加载(启动容器) ApplicationContext applicationContext = new ApplicationContext(AppConfig.class); 1.1容器加载时如何扫描判断所扫描到的类上含有Component注解 1.根据传入的配置类拿到ComponentScan类信息 2.获取扫描路径 包 com.tes.service--->需转为com/tes/service 3.根据获取到的扫描路径获取在

qq_764694767的博客 462

Spring Boot 自动配置

Spring Boot 的自动配置:当 Spring 容器启动后,一些配置类、bean 对象等就自动存入 Ioc 容器中,而不再需要我们手动去声明,从而简化了程序开发过程,省去了繁琐的配置操作也就是说,Spring Boot 的自动配置,就是SpinrgBoot将依赖 jar 包中的配置类以及Bean加载到Spring Ioc 容器中的过程在本篇文章中,我们主要学习一下两个方面:1. Spring 如何将对象加载到 Spring Ioc 容器中2. SpringBoot 是如何进行实现的。

2509_94082020的博客 827

Spring DI注入规则

1.Spring怎么知道注入哪个实现? As long as there is only a single implementation of the interface and that implementation is annotated with @Component with Spring’s component scan enabled, S spring framework can...

细雪扶风 255

Spring系列——两万字长文教会你Spring (超详细!!!)

到此,我们学习完了 Spring 框架,包括: Spring 体系结构 Spring Bean Spring AOP Spring JDBC Spring 事务管理 写此文章是为了做个笔记,等以后自己忘记了可以回头快速上手。同时也分享给小伙伴们,希望我们都能越来越好,不会就学 B 站,不懂就问 AI,总好过自己两耳不闻窗外事的独自琢磨。 最后认识一下吧,笔者叫`北迁`,hhh~~。

weixin_63009611的博客 1181

Spring 依赖注入——模拟实现(一)(对象注入)

Spring 依赖注入

三水木目的博客 596

第六章IOC:使用注解装配bean

本节介绍使用注解的方式来装配Bean。当然对于xml配置文件还是需要的,但可以极大减少xml的配置内容。 在这之前先为大家介绍一下四种类型的注解。括号中是我自己理解一些概念。需要了解的是spring框架本身是无法区分这些组建的作用,也就是说它只是都当作一个组建扫描,只是我们在使用的过程中来区分应用。 @Component 基本注解, 标识了一个受 Spring 管理的组件。 @Repo

自强博客 312
上一篇: 线程池+队列
下一篇: 简单的 threadlocal 模拟 及测试
vortex331
博客等级 码龄16年 0粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值