北京

点击搜索

发布

拉勾教育自己动手实现一个简单的IOC容器

区域:
北京 > 海淀 > 中关村
类别:
软件工程师培训
地址:
创业大街
控制反转,即Inversion of Control(IoC),是面向对象中的一种设计原则,拉勾IT课小编分解
可以用有效降低架构代码的耦合度,从对象调用者角度又叫做依赖注入,即Dependency Injection(DI),通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的容器,将其所依赖的对象的引用传递给它,也可以说,依赖被注入到对象中,这个容器就是我们经常说到IOC容器。Sping及SpringBoot框架的核心就是提供了一个基于注解实现的IoC容器,它可以管理所有轻量级的JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。
这篇文章我们自己动手实现一个基于注解的简单IOC容器,当然由于是个人实现不会真的完全按照SpringBoot框架的设计模式,也不会考虑过多的如循环依赖、线程安全等其他复杂问题, 整个实现原理很简单,扫描注解,通过反射创建出我们所需要的bean实例,再将这些bean放到集合中,对外通过IOC容器类提供一个getBean()方法,用来获取ean实例,废话不多说,下面开始具体设计与实现。
1、定义注解
@Retention(RetentionPolicy.RUNTIME)
public @interface SproutComponet {
  String value() default "";
}
@Target(Elemen***THOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SproutRoute {
  RouteEnum value();
}
2、实现jar包扫描类
根据传入jar包,扫描与缓存jar所有指定注解的class<?>类对象
public class ClassScanner {

  private static Set<Class<?>> classSet = null;
 
  private static Map<String, Class<?>> componetMap = null;

  /**
  * 获取指定包名下所有class类
  * @param packageName
  * @return
  * @throws Exception
  */
  public static Set<Class<?>> getClasses(String packageName) throws Exception {

    if (classSet == null){
        classSet = ReflectUtils.getClasses(packageName);

    }
    return classSet;
  }
 
 
  /**
  * 缓存所有指定注解的class<?>类对象
  * @param packageName
  * @return
  * @throws Exception
  */
  public static Map<String, Class<?>> getBean(String packageName) throws Exception {

    if (componetMap == null) {
        Set<Class<?>> clsList = getClasses(packageName);

        if (clsList == null || clsList.isEmpty()) {
          return componetMap;
        }

        componetMap = new HashMap<>(16);
        for (Class<?> cls : clsList) {

          Annotation annotation = cls.getAnnotation(SproutComponet.class);
          if (annotation == null) {
            continue;
          }

          SproutComponet sproutComponet = (SproutComponet) annotation;
          componetMap.put(sproutComponet.value() == null ? cls.getName() : sproutComponet.value(), cls);

        }
    }
    return componetMap;
  }

}
查看更多北京电脑/网络信息

免责声明:此信息系发布者(UID:706396)自行发布,本站是服务平台,仅提供信息存储空间服务,该信息内容的真实性及合法性由该发布者完全负责。

© lieju.com 联系我们