容器接口
??我們要完成自動裝配,那么就要有一個存放bean對象的容器,然后要有裝配的注解,那么哪些類該被存到容器呢,在spring中我們使用過@Service、@Resource等,看下面的代碼,你也可以做到。
????來看看這是一個簡單的容器接口
/***?容器接口*?@author:rex*?@create_time:2014-6-26*?@version:V1.0*/ public?interface?Container?{Object?getBean(String?name,?BeanType?beanType);Object?getBean(Class<?>?type,?BeanType?beanType);Set<?>?getBeanNames();Collection<?>?getBeans();boolean?hasBean(Class<?>?clazz);boolean?hasBean(String?name);void?registBean(Class<?>?clazz);void?initWired();}? ? 這個容器提供了基礎的存取方法,分別是獲取bean對象和注冊、是否包含bean,還有一個初始化的方法。
????接下來我們來為容器做一個基本的實現。? ??
import?java.lang.reflect.Field; import?java.lang.reflect.Modifier; import?java.util.Collection; import?java.util.HashMap; import?java.util.Iterator; import?java.util.Map; import?java.util.Set;import?com.biezhi.ioc.BeanType; import?com.biezhi.ioc.Container; import?com.biezhi.ioc.anntation.Autowired;/***?默認的bean容器實現*?@author:rex*?@create_time:2014-6-26*?@version:V1.0*/ public?class?DefaultContainerImpl?implements?Container?{//存放bean的容器private?final?Map<String,?Object>?beansMap?=?new?HashMap<String,?Object>();public?DefaultContainerImpl()?{//初始化加載beanContainerLoader?c?=?new?ContainerLoader(this);c.init();}@Overridepublic?Object?getBean(String?name,?BeanType?beanType)?{try?{if(beanType?==?BeanType.NEW)return?Class.forName(name).newInstance();}?catch?(Exception?e)?{e.printStackTrace();}return?beansMap.get(name);}@Overridepublic?Object?getBean(Class<?>?type,?BeanType?beanType)?{try?{if(beanType?==?BeanType.NEW)return?type.newInstance();}?catch?(InstantiationException?e)?{e.printStackTrace();}?catch?(IllegalAccessException?e)?{e.printStackTrace();}Iterator<Object>?it?=?this.beansMap.values().iterator();while(it.hasNext()){Object?obj?=?it.next();if(type.isAssignableFrom(obj.getClass())){return?obj;}}return?null;}@Overridepublic?Set<?>?getBeanNames(){return?beansMap.keySet();}@Overridepublic?Collection<?>?getBeans(){return?beansMap.values();}@Overridepublic?boolean?hasBean(Class<?>?clz)?{if(null?!=?this.getBean(clz,?null)){return?true;}return?false;}@Overridepublic?boolean?hasBean(String?name){if(null?!=?this.getBean(name,?null)){return?true;}return?false;}/***?注冊一個bean對象到容器里*/@Overridepublic?void?registBean(Class<?>?clazz){String?name?=?clazz.getCanonicalName();try?{if(!Modifier.isAbstract(clazz.getModifiers())?&&?!Modifier.isInterface(clazz.getModifiers())){Object?obj?=?clazz.newInstance();beansMap.put(name,?obj);}}?catch?(InstantiationException?e)?{e.printStackTrace();}?catch?(IllegalAccessException?e)?{e.printStackTrace();}?}/***?初始化注入*/@Overridepublic?void?initWired(){Iterator<Object>?it?=?this.beansMap.values().iterator();try?{while(it.hasNext()){Object?obj?=?it.next();Field[]?fields?=?obj.getClass().getDeclaredFields();for(Field?field?:?fields){Autowired?autowired?=?field.getAnnotation(Autowired.class);if(null?!=?autowired){//要注入的字段Object?wiredField?=?this.getBean(field.getType(),?null);if(null?==?wiredField){throw?new?RuntimeException("Unable?to?load?"+field.getType().getCanonicalName()+"!");}boolean?accessible?=?field.isAccessible();field.setAccessible(true);field.set(obj,?wiredField);field.setAccessible(accessible);}}}}?catch?(SecurityException?e)?{e.printStackTrace();}?catch?(IllegalArgumentException?e)?{e.printStackTrace();}?catch?(IllegalAccessException?e)?{e.printStackTrace();}?} }????在構造器里將掃描到的類加載到容器里,然后提供注冊bean和獲取bean的方法。
????這個類是加載需要的類文件。還有幾個代碼文件沒有貼出來,想看代碼的等會打包自己看。
????接下來我們看看這個測試,
? ??
@Service public?class?A?{String?name?=?"菊花";public?void?say(){System.out.println("hello,?I,m?rex?!");} } @Service public?class?B?{@Autowiredprivate?A?a;private?String?qq?=?"3838438";public?void?hehe(){a.say();System.out.println("請問您是"?+?a.name?+?"嗎?");}public?String?getQq(){return?this.qq;} } public?class?Test?{public?static?void?main(String[]?args)?{Container?c?=?new?DefaultContainerImpl();c.initWired();//System.out.println(c.getBeanNames());B?b?=?(B)?c.getBean(B.class,?BeanType.SINGLE);b.hehe();System.out.println(b.getQq());System.out.println("==================");B?b2?=?(B)?c.getBean(B.class,?BeanType.NEW);b2.hehe();} }????運行結果:
hello,?I,m?rex?! 請問您是菊花嗎? 3838438 ================== Exception?in?thread?"main"?java.lang.NullPointerExceptionat?com.biezhi.ioc.test.B.hehe(B.java:15)at?com.biezhi.ioc.test.Test.main(Test.java:18)好了,這樣就基本完成了一個簡單的ioc自動裝配。有喜歡的朋友可以參考代碼。點擊下載
快樂賺 http://www.wanzhuanlewangba.com/
www.baiyi1.cn
聚享游 http://www.tiantanzuan.com/站內文章,如需轉載,請保留作者和出處(云棲社區),并郵件通知云棲社區(yqeditor@list.alibaba-inc.com)。
總結
- 上一篇: 鱼眼相机相关概念
- 下一篇: 使用VSccde上传文件到Git时可能出