一个模仿spring IOC功能的小练习---smallioc
来源:互联网 发布:js 数组 contains方法 编辑:程序博客网 时间:2024/06/06 02:48
微小型的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源码
阅读全文