IoC和AOP是Spring的核心,可以说没有他们就没有庞大的Spring家族。我也是心血来潮,自己动手写了一个简易的Spring框架。可以通过使用注解来实现IoC容器和AOP。
先说IoC部分吧。源码下载:http://download.csdn.net/detail/jobsandczj/9841126
IoC
先定义了两个注解@MyBean和@MyAutowired,用来标记Bean和自动注入的对象。
package mySpring.autowired;
import java.lang.annotation.*;
/**
* Created by 10033 on 2017/5/9.
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyBean {
String value();
}
package mySpring.autowired;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyAutowired {
}
实现思路:
我的思路是在一个properties文件里配置要扫描的包( Resource定位),通过扫描这些包获得他们的Class对象存入List中( 载入和解析),将list中的Class对象转储到Map中,以@Bean里配置的Bean名为key( 注册),再通过反射将Map里的Class转换成Bean( 注入)。当然,注入的时候要判断是否循环依赖,这个我是在注入过程中判断的,也可以预判,但可能会稍麻烦些。下面是自动注入类的代码:
package mySpring.autowired;
/**
* Created by 10033 on 2017/5/9.
*/
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 自动注入类
*/
public class AutomaticInjection {
public static void automaticInjection(String key, Map mmp) {
try {
List<Class> list = GetClass.getClassList(key);
for(Class classes:list) {
//注册
Map<String, Object> judgeMap = new HashMap();
//注入
injection(mmp,classes,judgeMap);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catc