自定义注解版Spring框架

Spring框架简介

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

自定义注解版Spring框架

项目结构:
自定义注解版Spring框架_第1张图片
Component.java

 package annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Component {
    	public String name() default "";
    }

Value.java

 package annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Value {
    	public String name() default "";
    	public String isPOJO() default "NO";
    }

AnnotaionConfigApplicationContext.java

package org.springframework.context;
    
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import annotation.Component;
import annotation.Value;

public class AnnotationConfigApplicationContext implements AppcationContext{
	private Map map = new HashMap<>();
	
	public AnnotationConfigApplicationContext(String packageName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		//把包路径转换成资源路径
		String path = packageName.replace(".","/");
		//获取项目的绝对路径
		URL url = this.getClass().getClassLoader().getResource(path);
		//判断路径是否存在
		if(url != null) {
			//创建文件对象
			File file = new File(url.getPath());
			//判断是否是目录
			if(file.isDirectory()) {
				//获取目录下的所有子文件
				File[] listFiles = file.listFiles();
				for (File f : listFiles) {
					//获取文件名
					String fName = f.getName();
					//把文件名转成包名通过反射机制创建实例
					String pName = path+"."+fName.substring(0,fName.indexOf("."));
					//创建字节码对像
					Class<?> cls = Class.forName(pName);
					//创建实例
					Object obj = cls.newInstance();
					//判断是否有Bean注解
					if(cls.isAnnotationPresent(Component.class)) {
						//获取实例id
						String id = cls.getAnnotation(Component.class).name();
						if("".equals(id)) {
							//如果没有设置id就默认用小写类名
							id = cls.getSimpleName().toLowerCase();
						}
						//置入容器
						map.put(id,obj);
						//获取所有属性
						Field[] fields = cls.getDeclaredFields();
						for (Field field : fields) {
							//判断属性是否有value注解
							if(field.isAnnotationPresent(Value.class)) {
								//如果有获取对应的值
								String value = field.getAnnotation(Value.class).name();
								String isPOJO = field.getAnnotation(Value.class).isPOJO();
								field.setAccessible(true);
								if("NO".equals(isPOJO)) {
									field.set(obj, value);
								}else {
									field.set(obj, map.get(value));
								}
							}
						}
					}
				}
			}
		}
	 }
	@Override
	public Object getBean(String beanName) {
		return map.get(beanName);
	}
}

AppcationContext.java

package org.springframework.context;
    
public interface AppcationContext {
	public Object getBean(String beanName);
}

Student.java

package pojo;

import annotation.Component;
import annotation.Value;

@Component
public class Student {
	@Value(name = "1001")
	private String id;
	@Value(name = "张三")
	private String name;
	
	public Student(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}
}

StuManage.java

package pojo;
    
import annotation.Component;
import annotation.Value;

@Component(name="stum")
public class StuManage {
	@Value(isPOJO="YES",name="student")
	private Student student;
	
	public StuManage() {
		super();
		// TODO Auto-generated constructor stub
	}

	public StuManage(Student student) {
		super();
		this.student = student;
	}

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	@Override
	public String toString() {
		return " StuManage [ student = " + student + " ] ";
	}
}

Test.java

package test;

import java.lang.reflect.InvocationTargetException;
import org.springframework.context.AnnotationConfigApplicationContext;
import org.springframework.context.AppcationContext;

import pojo.StuManage;
import pojo.Student;

public class Test {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,  IllegalArgumentException, InvocationTargetException {
		AppcationContext app = new AnnotationConfigApplicationContext("pojo");
		StuManage manage = (StuManage)app.getBean("stum");
		System.out.println(manage);		
	}
}

运行结果:
自定义注解版Spring框架_第2张图片

你可能感兴趣的:(Spring)