日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

使用Java反射模擬實現(xiàn)Spring的IoC容器的操作

瀏覽:123日期:2023-12-03 17:18:49
目錄實現(xiàn)的功能:項目結構下面是程序的項目結構圖:自定義注解容器實現(xiàn)測試實體類User的定義:實現(xiàn)的功能: 默認情況下將掃描整個項目的文件 可以使用@ComponentScan注解配置掃描路徑 只將被@Component注解修飾的類裝載到容器中 可以使用@AutoWired注解實現(xiàn)自動裝配 讀取配置文件中的聲明的類并注冊到容器中項目結構下面是程序的項目結構圖:

使用Java反射模擬實現(xiàn)Spring的IoC容器的操作

自定義注解

下面是自定義的三個注解: @AutoWired,@Component,@ComponentScan。

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface AutoWired {}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Component {}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ComponentScan { String[] value();}容器實現(xiàn)

其中AnnotationConfigApplicationContext和ClassPathXMLApplicationContext為核心的類,其中

AnnotationConfigApplicationContext類實現(xiàn)掃描文件和解析注解等功能。

package learn.reflection.reflect;import learn.reflection.Bootstrap;import learn.reflection.annotation.AutoWired;import learn.reflection.annotation.Component;import learn.reflection.annotation.ComponentScan;import java.io.File;import java.io.InputStream;import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;import java.util.Properties;import java.util.Set;public class AnnotationConfigApplicationContext<T>{ //使用HaspMap存儲Bean private HashMap<Class,Object> beanFactory=new HashMap<>(); //獲取Bean的方法 public T getBean(Class clazz){ return (T) beanFactory.get(clazz); } String path;//編譯后的字節(jié)碼存儲路徑 /** * 初始化ApplicationContext,加載注解修飾的Bean到beanFactory */ public void initContextByAnnotation(){ //編譯后的項目根目錄:D:/idea_workplace/javaAppliTechnology/target/classes/ path = AnnotationConfigApplicationContext.class.getClassLoader().getResource('').getFile(); //查看啟動類Bootstrap是否有定義掃描包 ComponentScan annotation = Bootstrap.class.getAnnotation(ComponentScan.class); if (annotation!=null){ //有定義就只掃描自定義的 String[] definedPaths = annotation.value(); if (definedPaths!=null&&definedPaths.length>0){loadClassInDefinedDir(path,definedPaths); } }else{ //默認掃描整個項目的目錄 System.out.println(path); findClassFile(new File(path)); } assembleObject(); } /** * 給@AutoWired修飾的屬性賦值 */ private void assembleObject(){ Set<Map.Entry<Class, Object>> entries = beanFactory.entrySet(); //掃描所有容器中的Bean for (Map.Entry<Class, Object> entry : entries) { Object value = entry.getValue(); //獲取所有屬性 Field[] fields = value.getClass().getDeclaredFields(); for (Field field : fields) {//如果被@AutoWired注解修飾則進行賦值AutoWired annotation = field.getAnnotation(AutoWired.class);if (annotation!=null){ try { field.setAccessible(true); field.set(value,beanFactory.get(field.getType())); } catch (IllegalAccessException e) { e.printStackTrace(); }} } } } /** * 掃描用戶自定義的包 * @param path * @param definedPaths */ private void loadClassInDefinedDir(String path, String[] definedPaths){ for (String definedPath : definedPaths) { //轉換成絕對路徑 String s = definedPath.replaceAll('.', '/'); String fullName=path+s; System.out.println(s); findClassFile(new File(fullName)); } } /** * 掃描項目中的每一個文件夾找到所有的class文件 */ private void findClassFile(File pathParent) { //路徑是否是目錄,子目錄是否為空 if (pathParent.isDirectory()) { File[] childrenFiles = pathParent.listFiles(); if (childrenFiles == null || childrenFiles.length == 0) {return; } for (File childrenFile : childrenFiles) {if (childrenFile.isDirectory()) { //遞歸調用直到找到所有的文件 findClassFile(childrenFile);} else { //找到文件 loadClassWithAnnotation(childrenFile);} } } } /** * 裝配找到的所有帶有@Component注解的類到容器 */ private void loadClassWithAnnotation(File file) { //1.去掉前面的項目絕對路徑 String pathWithClass=file.getAbsolutePath().substring(path.length()-1); //2.將路徑的“/”轉化為“.”和去掉后面的.class if (pathWithClass.contains('.class')){ String fullName = pathWithClass.replaceAll('', '.').replace('.class', ''); /** * 根據(jù)獲取到的類的全限定名使用反射將實例添加到beanFactory中 */ try {Class<?> clazz = Class.forName(fullName);//3.判斷是不是接口,不是接口才創(chuàng)建實例if (!clazz.isInterface()){ //4.是否具有@Bean注解 Component annotation = clazz.getAnnotation(Component.class); if (annotation!=null){ //5.創(chuàng)建實例對象 Object instance = clazz.newInstance(); //6.判斷是否有實現(xiàn)的接口 Class<?>[] interfaces = clazz.getInterfaces(); if (interfaces!=null&&interfaces.length>0){ //如果是有接口就將其接口的class作為key,實例對象作為value System.out.println('正在加載【'+interfaces[0].getName()+'】 實例對象:'+instance.getClass().getName()); beanFactory.put(interfaces[0],instance); }else{ System.out.println('正在加載【'+clazz.getName()+'】 實例對象:'+instance.getClass().getName()); beanFactory.put(clazz,instance); } //如果沒有接口就將自己的class作為key,實例對象作為value }} } catch (Exception e) {e.printStackTrace(); } } }}

ClassPathXMLApplicationContext類實現(xiàn)解析xml配置文件,并裝載組件到容器中。

package learn.reflection.reflect;import java.net.URL;import java.util.HashMap;import java.util.Map;import org.jdom2.Document;import org.jdom2.JDOMException;import org.jdom2.Element;import org.jdom2.xpath.XPath;import org.jdom2.input.SAXBuilder;import java.io.File;import java.io.IOException;import java.net.URL;import java.net.URISyntaxException;import java.util.*;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetException;/** * @author Hai * @date 2020/5/17 - 18:47 */public class ClassPathXMLApplicationContext{ private File file; private Map<String,Object> map = new HashMap(); public ClassPathXMLApplicationContext(String config_file) { URL url = this.getClass().getClassLoader().getResource(config_file); try { file = new File(url.toURI()); XMLParsing(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void XMLParsing() throws Exception { SAXBuilder builder = new SAXBuilder(); Document document = builder.build(file); Element root = document.getRootElement(); List elementList = root.getChildren('bean'); Iterator i = elementList.iterator(); //讀取bean節(jié)點的所有信息 while (i.hasNext()) { Element bean = (Element) i.next(); String id = bean.getAttributeValue('id'); //根據(jù)class創(chuàng)建實例 String cls = bean.getAttributeValue('class'); Object obj = Class.forName(cls).newInstance(); Method[] method = obj.getClass().getDeclaredMethods(); List<Element> list = bean.getChildren('property'); for (Element el : list) {for (int n = 0; n < method.length; n++) { String name = method[n].getName(); String temp = null; //找到屬性對應的setter方法進行賦值 if (name.startsWith('set')) { temp = name.substring(3, name.length()).toLowerCase(); if (el.getAttribute('name') != null) { if (temp.equals(el.getAttribute('name').getValue())) {method[n].invoke(obj, el.getAttribute('value').getValue()); } } }} } map.put(id, obj); } } public Object getBean(String name) { return map.get(name); }}測試實體類User的定義:

@Componentpublic class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public User() { } //省略getter,setter方法 }

在UserServiceImpl類中添加@Component注解,并使用@AutoWired注解注入容器中的IUerDao接口的實現(xiàn)類UserDaoImpl。

@Componentpublic class UserServiceImpl implements IUserService { @AutoWired private IUserDao userDao; @Override public void login(User user) { System.out.println('調用UserDaoImpl的login方法'); userDao.loginByUsername(user); }}

UserDaoImpl類同樣添加@Component注解

@Componentpublic class UserDaoImpl implements IUserDao { @Override public void loginByUsername(User user) { System.out.println('驗證用戶【'+user.getUsername()+'】登錄'); }}

在beans.xml中配置注冊User類,文件beans.xml的內容如下:

<?xml version='1.0' encoding='UTF-8'?><beans> <bean class='learn.reflection.entity.User'><property name='username' value='張三' /><property name='password' value='123' /> </bean></beans>

下面同時使用 AnnotationConfigApplicationContext類和 ClassPathXMLApplicationContext類。

Bootstrap類作為啟動類添加注解@ComponentScan,指定掃描learn.reflection.dao和learn.reflection.service這兩個包。

@ComponentScan(value = {'learn.reflection.dao','learn.reflection.service'})public class Bootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.initContextByAnnotation(); UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean(IUserService.class); ClassPathXMLApplicationContext xmlApplicationContext = new ClassPathXMLApplicationContext('beans.xml'); User user = (User) xmlApplicationContext.getBean('user'); System.out.println(user); userService.login(user); }}

運行Bootstrap類,程序運行結果如下:

learn/reflection/dao正在加載【learn.reflection.dao.IUserDao】 實例對象:learn.reflection.dao.impl.UserDaoImpllearn/reflection/service正在加載【learn.reflection.service.IUserService】 實例對象:learn.reflection.service.impl.UserServiceImplUser{username=’張三’, password=’123’}調用UserDaoImpl的login方法驗證用戶【張三】登錄

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产亚洲夜色av网站| 国产亚洲久久| 高潮一区二区| 欧美日韩一区二区三区不卡视频 | 国产欧美日韩一级| 青青草伊人久久| 国产精品一级| 久久精品国产亚洲aⅴ| 国产一区二区三区91| 成人亚洲欧美| 欧美在线亚洲| 九九久久婷婷| 日韩一区欧美二区| 国产日韩欧美一区二区三区| 国产精品久久久久久久久久妞妞| 久久精品国产网站| 日本不卡一二三区黄网| 欧美 日韩 国产精品免费观看| 91福利精品在线观看| 超级白嫩亚洲国产第一| 日韩黄色大片| 亚洲精选成人| 99国产精品久久久久久久| 在线日韩电影| 亚洲精品九九| 欧美亚洲国产激情| 欧美成人高清| 玖玖玖国产精品| 欧美日韩一区二区国产| 精品一区视频| 国内精品99| 亚洲精品高潮| 国产96在线亚洲| 亚洲综合二区| 久久a爱视频| 免费观看不卡av| 欧美在线黄色| 日韩在线观看| 日韩美女精品| 免费在线小视频| 亚洲乱亚洲高清| 国产福利一区二区精品秒拍| 久久高清免费| 欧美一区精品| 日韩毛片在线| 亚洲精品在线a| 黑森林国产精品av| 亚洲精品系列| 成人羞羞视频播放网站| 亚洲欧洲美洲国产香蕉| av在线最新| 日韩高清一区| 激情欧美日韩一区| 国产精品**亚洲精品| 亚洲天堂成人| 麻豆久久久久久| 五月婷婷亚洲| 国产精品magnet| 亚洲欧洲日本mm| 久久99国产精品视频| 午夜在线一区二区| 成人国产精品一区二区网站| 蜜臀久久99精品久久久久宅男| 精品国产美女a久久9999| 国产精品日本| 中文在线中文资源| 欧美午夜三级| 免费精品视频| 日韩av首页| 你懂的国产精品永久在线| 日韩中文字幕麻豆| 亚洲黄色免费av| 国产亚洲精品精品国产亚洲综合| 午夜日本精品| 亚洲精品福利电影| 国产亚洲观看| 中文字幕日本一区二区| 久久久9色精品国产一区二区三区| 91麻豆精品激情在线观看最新| 蜜桃视频欧美| 天堂8中文在线最新版在线| 国产精品美女午夜爽爽| 四虎国产精品免费久久| av一区二区高清| 国产传媒av在线| 捆绑调教美女网站视频一区| 亚洲制服欧美另类| 日韩一区二区久久| 久久精品动漫| 成人精品国产亚洲| 里番精品3d一二三区| 日韩精品91亚洲二区在线观看| 中文字幕一区二区三区日韩精品 | 国产美女视频一区二区| 亚洲综合不卡| 亚洲性图久久| 国产一区二区三区四区五区传媒| 日韩高清在线不卡| 免费视频最近日韩| 亚洲精品一区二区妖精| 99国产精品免费视频观看| 国产精品99久久精品| 精品视频亚洲| 久久亚洲黄色| 精品视频国产| 欧美国产精品| 麻豆精品99| 麻豆精品在线| 福利视频一区| 中文字幕高清在线播放| 三上亚洲一区二区| 粉嫩av一区二区三区四区五区| 国产精品香蕉| 久久99久久人婷婷精品综合| 国产欧美大片| 欧美激情久久久久久久久久久| 日韩国产欧美一区二区三区| 亚洲免费成人av在线| 日韩中文字幕无砖| 日韩精品久久久久久| 日韩国产一二三区| 国产日韩一区二区三区在线| 国产九一精品| 久久一区精品| 高清av一区| 伊人久久视频| 久久激情婷婷| 九九久久电影| 丝袜亚洲精品中文字幕一区| 亚洲欧洲专区| 欧美天堂一区二区| 久久精品欧洲| 毛片在线网站| 不卡中文一二三区| 三级在线观看一区二区| 日本中文字幕不卡| 国产精品17p| 国产高潮在线| 蜜桃tv一区二区三区| 视频在线在亚洲| 日韩毛片一区| 国产精品地址| 日韩欧美一区二区三区在线视频 | 国产精品午夜av| 黄色精品视频| 999久久久国产精品| 亚洲深夜影院| 日韩精品视频一区二区三区| 国产极品嫩模在线观看91精品| 日本一区二区高清不卡| 99久久亚洲精品| 亚洲综合图色| 国产精品激情电影| 色爱综合av| 亚洲精品极品| 精品伊人久久| 影院欧美亚洲| 国产视频网站一区二区三区| 国产在线看片免费视频在线观看| 欧美日韩精品一本二本三本 | 久久激情综合网| 国产精选在线| 丝袜美腿亚洲色图| 国产欧美一区二区三区精品观看 | 精品国产精品国产偷麻豆| 久久视频精品| 日韩毛片网站| 最近高清中文在线字幕在线观看1| 午夜日本精品| 国产精品magnet| av亚洲在线观看| 国产日韩免费| 久久高清免费| 国产午夜一区| 亚洲午夜一级| 国产精品tv| 欧美特黄一级| 国产欧美88| 精品日韩毛片| 国产精品久av福利在线观看| 国模 一区 二区 三区| 欧美亚洲tv| 不卡一区2区| 精品日产乱码久久久久久仙踪林| 香蕉成人久久| 国产精品精品| 日韩高清不卡在线| 久久国产中文字幕| 国产精品久久| 噜噜噜躁狠狠躁狠狠精品视频 | 日本色综合中文字幕| 天堂av在线| 欧美日韩va| 国产亚洲精品久久久久婷婷瑜伽| 国产精品jk白丝蜜臀av小说| 久久国产精品久久久久久电车| 岛国av在线网站| 欧美一级网站| 日韩中文字幕1| 久久亚洲专区|