日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

容器接口

發布時間:2024/1/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 容器接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??我們要完成自動裝配,那么就要有一個存放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的方法。

import?java.io.File; import?java.io.FileFilter; import?java.util.HashSet; import?java.util.Set;import?com.biezhi.ioc.Container; import?com.biezhi.ioc.anntation.Service; import?com.biezhi.ioc.util.ClassHelper;/***?加載容器bean*?@author:rex*?@create_time:2014-6-26*?@version:V1.0*/ public?class?ContainerLoader?{private?Container?container;public?ContainerLoader(Container?container)?{this.container?=?container;}public?void?init(){//加載要掃描的包,這里可以使用配置文件,我們就默認掃描所有類Set<String>?packages?=?getPackages();for(String?pack?:?packages){scanPack(pack);}//初始化注入container.initWired();}private?void?scanPack(String?pack){Set<Class<?>>?classes?=?ClassHelper.scanPackage(pack);for(Class<?>?clazz?:?classes){//?這里我只把帶有@Service注解的存進去了,你也可以存其他的或者全部Service?service?=?clazz.getAnnotation(Service.class);if(null?!=?service){//將掃描到的對象保存到容器中container.registBean(clazz);}}}/***?獲取當前classes的包名稱*?@author:rex??*?@return*/private?Set<String>?getPackages(){Set<String>?packages?=?new?HashSet<String>();String?appPath?=?ContainerLoader.class.getResource("/").getPath();File?classDir?=?new?File(appPath);//?如果存在?就獲取包下的所有文件?包括目錄File[]?dirfiles?=?classDir.listFiles(new?FileFilter()?{public?boolean?accept(File?file)?{return?file.isDirectory();}});for(File?f?:?dirfiles){packages.add(f.getName());}return?packages;} }

????這個類是加載需要的類文件。還有幾個代碼文件沒有貼出來,想看代碼的等會打包自己看。

????接下來我們看看這個測試,

? ??

@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)。

總結

以上是生活随笔為你收集整理的容器接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。