一个模仿spring IOC功能的小练习---smallioc

微小型的IOC容器

起因

起因是由于我在编写工作中需要的GUI小工具时候遇到了很多对象之间引用的麻烦,突然感觉到习惯了spring 带来的IOC的便利后很难回到原始的状态。
我试图把spring中的IOC功能拆分开来,最后得到了将近3M的各种jar包,而我写的代码才100k。spring实在是太强大了,但他也越来越臃肿,而我只想要简单的IOC功能。
最终我决定为自己写一个微型的纯粹的IOC框架,顺便学习下Spring。

设计

因为离开了AOP后其实Ioc的一些功能也会受到影响。所以这个工程只有很弱的基础IOC功能
我想让工程往极简方向发展,所以取消了XML 和properties配置文件。
支持的最简单的配置放在了初始化容器之前的静态方法里,包括日志记录
所有代码加起来的大小只有50k,适用于自己练习小的project项目 或制作小工具等
工程只是简单完成 并使用在了我自己的一个小工具上,未经过任何完整的测试
代码里只有 cn路径下是源码,其他都是无效的测试类
这里写图片描述

使用

核心包 cn.lsg.smallioc.core 内的ApplicationContext是 唯一入口

public class Test{
public static void main(String[] args) {
  //设置默认日志记录器配置
  ApplicationContext.setDefaultLoggerParams(true, false, LEVEL.debug, "C:/Users/Administrator/Desktop");
ApplicationContext.replaceLogger(log);//更换掉默认的日志记录器

  //获取容器对象 首次获取容器对象必须传入一个或多个扫描的包路径,
  ApplicationContext app = ApplicationContext.getContext("com");
  //或者
  ApplicationContext app = ApplicationContext.getContext("com","cn.lsg","org.lsg");
  //当容器初始化完成后 则可以传空参获取容器对象
  ApplicationContext app = ApplicationContext.getContext();


  //获取非注入的获取实例对象可以通过ApplicationContext内的方法
   A a1=app.getbean(A.class);//根据类型
   A a2=(A) app.getbean("aaa");//根据id 要强制转换
   A a3=app.getbean("aaa",A.class);//根据id
   }}

将类纳入容器管理目前只支持注解 这里的注解只有两个:
inject(id) id不输则默认按类型注入,可以是根据接口类型注入但要保证接口下只有唯一的受管类,否则必须使用id
member(id,single) id默认首字母小写的类名,默认单例

@Member(id="jijij")
public class A implements O{
    @Inject
    public B b;
}
 @Member(single=false)
public class B implements O {

    @Inject(id="jijij")
    public A a;

    @Inject
    public C c;

  }

github源码

猜你喜欢

转载自blog.csdn.net/PiaoMiaoXiaodao/article/details/78887774