`

模拟Spring扫描注解类

    博客分类:
  • Java
 
阅读更多

1,编写注解类

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {

	public String value();
}

 

2,扫描指定包下的所有.class结尾的类

        static List<String> list = new ArrayList<String>();
	static String packageDirName = "com.space".replace('.', '/'); 
	static StringBuffer buffer = new StringBuffer("com.space");
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		 
		  
	     Enumeration<URL> dirs=Thread.currentThread().getContextClassLoader().getResources(packageDirName);  
	   
	     while(dirs.hasMoreElements()){
	    	 URL url = dirs.nextElement();
             
	         String protocol = url.getProtocol();  
	         if ("file".equals(protocol)){//文件扫描
	             String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); 
	             File file = new File(filePath);
	             getClassName(file);
	         }  

	        if ("jar".equals(protocol)) {  
	            JarFile jar= ((JarURLConnection) url.openConnection()).getJarFile(); 
	            Enumeration<JarEntry> entries = jar.entries();//获取文件,需要递归处理文件夹

	        }
	     }
	     
	 
	     for(String str:list){
	    	 System.out.println(str);
	    	 Class<?> c = Class.forName(str);
	    	 boolean isAnno = c.isAnnotationPresent(Description.class);
	    	 if(isAnno){
	    		 Description d = c.getAnnotation(Description.class);
	    		 System.out.println(d.value());
	    	 }
	     }

	}
	
	public static void getClassName(File file) throws IOException{
		if(file.isDirectory()){
			File[] files =file.listFiles(new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					return pathname.getName().endsWith(".class")||pathname.isDirectory();
				}
			});
			for(File f:files){
				getClassName(f);
			}
			 
		}else{
			String name =file.getAbsolutePath();
			name = name.substring(name.lastIndexOf("com\\space")).replaceAll("\\\\", ".");
			name = name.substring(0, name.lastIndexOf("."));
			list.add(name);
		}
	}

 如果大家有更好的办法可以相互学习下

分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...

    模拟spring实现包扫描器功能

    本文将深入探讨如何模拟Spring实现包扫描器功能,以便在不依赖Spring框架的情况下,扫描指定包下的所有类。 首先,我们需要理解Spring是如何进行包扫描的。在Spring中,这个过程由`org.springframework.context....

    使用反射和注解模拟Spring的依赖注入

    模拟Spring的依赖注入,我们可以创建一个简单的容器类,它使用反射来扫描带有特定注解的类,并根据这些注解管理bean。以下步骤概括了这个过程: 1. **定义注解**:创建自定义注解,如`@MyComponent`,用于标记需要...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...

    Java模拟spring实现

    在本文中,我们将探讨如何通过Java来模拟Spring框架的基本功能。Spring是一个广泛应用的开源框架,它主要为Java应用程序提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...

    自己动手模拟spring

    在模拟Spring的过程中,我们需要理解如何设计接口和实现类,以及如何通过容器来管理这些对象并负责它们之间的依赖关系。DI通常通过构造器注入、设值注入和接口注入等方式实现。 2. **组件扫描(Component Scanning...

    模拟Spring的IoC容器实现注解自动装配

    1. **扫描注解**:遍历所有的bean,查找带有@Autowired注解的字段、方法或构造器。 2. **类型匹配**:为每个需要自动装配的元素找到合适的依赖。这通常基于类型匹配,但也可以考虑@Qualifier注解来进行更精确的匹配...

    模拟Spring IoC

    在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...

    java 解析xml,模拟spring框架ioc

    模拟Spring的IOC功能,我们可以创建一个简单的解析器类,该类负责加载XML配置文件,解析Bean定义,实例化和注入依赖。为了实现这个功能,我们需要了解和使用Java的DOM或SAX解析库,以及反射API。这是一个很好的学习...

    spring注解 -----最简单的注解与自动装配例子

    在实际应用中,我们可能还需要用到@ComponentScan注解来扫描指定包下的所有注解类,让Spring容器管理这些类: ```java @Configuration @ComponentScan("com.example.myapp") public class AppConfig { // ... } ``...

    Java模拟的spring实现

    最后,模拟Spring的自动扫描和组件注册功能,我们可以设计一个类扫描机制,遍历指定的包路径,找到所有的`@Component`注解的类,然后将它们注册到`BeanFactory`中。 总结起来,模拟Spring的实现是一个深度学习...

    使用Java自定义注解模拟实现SpringBoot相关注解.zip

    我们可以创建一个`@MyComponent`注解,然后写一个元注解处理器,如`@ComponentScan`,来扫描标记了`@MyComponent`的类并将其注册到Spring容器中。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(Element...

    使用xml和annotation实现类似spring依赖注入和自动扫描类的功能

    在提供的压缩包文件"like_spring"中,可能包含了一个简单的实现,用于模拟Spring的这些功能。这个实现可能包含了XML配置文件、带有注解的Java类,以及一些测试用例,用于演示如何在没有Spring框架的情况下实现依赖...

    简单模拟springIoc容器

    在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...

    Mybatis整合Spring模拟代码

    2. **MapperScannerConfigurer**:这是一个Spring的Bean,用于扫描指定包下的Mapper接口,并将它们注册到Spring的ApplicationContext中,这样就可以通过@Autowired注解实现Mapper接口的自动注入。 3. **Mapper接口...

    Spring 注解学习手札(六) 测试

    9. **Mockito 和 EasyMock**:Spring测试框架与Mockito、EasyMock等库配合使用,可以方便地创建和配置mock对象,对依赖进行模拟,从而专注于测试目标类的行为。 10. **Integration Testing**:Spring提供了`@...

    spring-framework-2.5.5

    在Spring 2.5.5中,注解驱动的开发(Annotation-driven development)已经变得非常流行,比如使用`@Autowired`、`@Component`、`@Service`、`@Repository`和`@Controller`等注解,简化了组件扫描和自动装配的过程。...

    spring test学习2

    2. `@RunWith(SpringRunner.class)`:这是一个JUnit注解,它使得测试类由Spring Test Runner执行,这样测试环境会自动配置。 3. `@SpringBootTest`:这是Spring Boot测试注解,用于启动一个完整的Spring应用上下文...

    Spring-Boot-Reference-Guide, Spring Boot Reference Guide中文翻译 -《Spring Boot参考指南》.zip

    2. 自动配置:基于条件注解的自动配置,能根据项目中的类和配置文件自动设置Bean。 3. 内嵌式Servlet容器:Spring Boot支持内嵌Tomcat、Jetty或Undertow,无需额外部署WAR文件。 4. 健康检查:提供健康检查API,用于...

    apache wink集成spring 开发rest服务

    此外,可以使用Spring的`@Component`注解标记Wink资源类,然后通过`ComponentScan`扫描这些类并自动注册到Wink应用中。 3. **资源类**:Wink资源类是处理HTTP请求的核心,通常会使用`@Path`注解来指定URI模板,用`@...

Global site tag (gtag.js) - Google Analytics