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

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

使用Java注解模擬spring ioc容器過程解析

瀏覽:18日期:2022-08-29 15:13:06

使用注解,簡單模擬spring ioc容器。通過注解給對象屬性注入值。

項目結構

使用Java注解模擬spring ioc容器過程解析

annotation 包,用于存放自定義注解

Component 注解表示該類為組件類,并需要聲明名字

package priv.haidnor.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 組件 */@Target(value = ElementType.TYPE)@Retention(value = RetentionPolicy.RUNTIME)public @interface Component {String name();}

Value 注解用于給類的屬性賦值

package priv.haidnor.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 字段值 */@Target(value = ElementType.FIELD)@Retention(value = RetentionPolicy.RUNTIME)public @interface Value {String value();}

ioc 包

package priv.haidnor.ioc;import priv.haidnor.annotation.Component;import priv.haidnor.annotation.Value;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.math.BigDecimal;import java.util.HashMap;import java.util.Map;public class ApplicationContext {/** * IOC 控制反轉容器,在加載類的時候創建 HashMap , 并存入指定對象 */private static Map<String, Object> ioc;static {try {// 初始化 IOC 容器ioc = new HashMap<String, Object>();// 反射獲得 Class 對象Class<?> clazz = Class.forName('priv.haidnor.pojo.Person');// 獲取指定注解Component componentClass = clazz.getAnnotation(Component.class);// 獲取指定注解的值String key = componentClass.name();// 通過反射創建對象Object object = clazz.newInstance();ioc.put(key, object);// 獲取 Java Bean 所有的字段Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 字段類型Class<?> type = field.getType();// 根據字段名生成 set 方法String filedName = field.getName();String methodName = produceSetMethodName(filedName);// 獲得 Value 注解Value valueAnnotation = field.getAnnotation(Value.class);// 獲得注解的值String theValue = valueAnnotation.value();// 構造 Method 對象Method method = clazz.getDeclaredMethod(methodName, field.getType());// 將注解參數轉換類型Object value = typeConversion(field.getType(), theValue);// 執行 set 方法method.invoke(object, value);}} catch (Exception e) {e.printStackTrace();}}/** * 類型轉換。將 String 字符串轉換為指定數據類型類型的值 * @param typeClass 字段類型 * @param value 注解值 * @return 字符串轉換為指定數據類型類型的值 */private static Object typeConversion(Class<?> typeClass, String value) {if (typeClass == int.class || typeClass == Integer.class) {if (value == null) {return 0;}return Integer.valueOf(value);} else if (typeClass == short.class) {if (value == null) {return 0;}return Short.valueOf(value);} else if (typeClass == byte.class) {if (value == null) {return 0;}return Short.valueOf(value);} else if (typeClass == double.class) {if (value == null) {return 0;}return Double.valueOf(value);} else if (typeClass == long.class) {if (value == null) {return 0;}return Long.valueOf(value);} else if (typeClass == String.class) {if (value == null) {return '';}return value;} else if (typeClass == Boolean.class) {if (value == null) {return false;}return Boolean.valueOf(value);} else if (typeClass == BigDecimal.class) {if (value == null) {return new BigDecimal(0);}return new BigDecimal(value + '');} else {return typeClass.cast(value);}}/** * 拼接字符串,生成 set 方法名 * @param filedName 字段名 * @return set方法名,例如傳入'name',則返回'setName' */private static String produceSetMethodName(String filedName) {return 'set' + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);}/** * 從容器中獲得指定對象 * @param name 對象名稱 * @return IOC 容器中的對象 */public static Object getBean(String name) {return ioc.get(name);}}

pojo 包

package priv.haidnor.pojo;import priv.haidnor.annotation.Component;import priv.haidnor.annotation.Value;@Component(name = 'man')public class Person {@Value('張三')private String name;@Value('男')private String gender;@Value('中國')private String country;@Value('23')private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return 'Person{' +'name=’' + name + ’’’ +', gender=’' + gender + ’’’ +', country=’' + country + ’’’ +', age=' + age +’}’;}}

測試類

import priv.haidnor.ioc.ApplicationContext;import priv.haidnor.pojo.Person;/** * 測試類 */public class Demo {public static void main(String[] args) {Person person = (Person) ApplicationContext.getBean('man');System.out.println(person);}}

運行程序后,控制臺輸出對象信息,可以看到從ioc容器中拿出的對象已經成功被注解賦值

使用Java注解模擬spring ioc容器過程解析

備注

內置注解

@Override:定義在java.lang.Override中,此注釋只適用于修辭方法,表示一個方法聲明打算重寫超類中的另一個方法聲明.

@Deprecated:定義在java.lang.Deprecated中,此注釋可以用于修辭方法,屬性,類,表示不鼓勵程序員使用這樣的元素,通常是因為它很危險或者存在更好的選擇.

@SuppressWarnings:定義在java.lang.SuppressWarnings中,用來抑制編譯時的警告信息.口與前兩個注釋有所不同,你需要添加一個參數才能正確使用,這些參數都是已經定義好了的,我們選擇性的使用就好了.

@SuppressWarnings ('all') @SuppressWarnings ('unchecked') @SuppressWarnings (value={'unchecked','deprecation'}) 等等……

4個元注解

元注解的作用就是負責注解其他注解,Java定義了4個標準的meta-annotation類型,他們被用來提供對其他annotation類型作說明.這些類型和它們所支持的類在java.lang.annotation包中可以找到

@Target:用于描述注解的使用范圍(即:作用域,被描述的注解可以用在什么地方)

@Target(value = {ElementType.TYPE,ElementType.CONSTRUCTOR})@Target(value = ElementType.TYPE)@Target(ElementType.TYPE)類,接口(包括注釋類型)或枚舉聲明 TYPE字段聲明(包括枚舉常量) FIELD方法聲明 METHOD形式參數聲明 PARAMETER構造聲明 CONSTRUCTOR局部變量聲明 LOCAL_VARIABLE注解類型聲明 ANNOTATION_TYPE包聲明 PACKAGE類型參數聲明 @since 1.8 TYPE_PARAMETER使用類型 @since 1.8 TYPE_USE

@Retention:表示需要在什么級別保存該注釋信息,用于描述注解的生命周期 (SOURCE<CLASS<RUNTIME)

@Retention(value = RetentionPolicy.CLASS)@Retention(RetentionPolicy.CLASS)注解將被編譯階段丟棄 SOURCE注解將由編譯器記錄在類文件中,但VM不必在運行時保留它們。這是默認行為。 CLASS注解由編譯器記錄在類文件中,并在運行時由VM保留,因此可以通過反射方式讀取它們 RUNTIME

@Document:說明該注解將被包含在javadoc中

@lnherited:說明子類可以繼承父類中的該注解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产精品免费一区二区三区| 91青青国产在线观看精品| 国产精品自在| 黑丝美女一区二区| 国产一区三区在线播放| 亚洲精品护士| 欧美激情福利| 福利片在线一区二区| 日本韩国欧美超级黄在线观看| 一本一道久久a久久精品蜜桃| 免费成人性网站| 日韩成人午夜精品| 麻豆一区二区在线| 日本不卡免费高清视频在线| 美女黄网久久| 欧美精品高清| 日本精品影院| 欧美日韩国产高清电影| 蜜臀精品一区二区三区在线观看 | 国产精品magnet| 91麻豆精品| 日韩国产精品久久久久久亚洲| 国产免费久久| 国产精品成人国产| 成人国产精品一区二区免费麻豆| 偷拍亚洲精品| 91欧美国产| 久久一区亚洲| 亚洲精一区二区三区| 国产一区二区视频在线看| 国产精品巨作av| 日本视频一区二区| 最新亚洲一区| 四季av一区二区凹凸精品| 97成人在线| 日韩欧美中文| 久久国产精品美女| 伊人精品久久| 蜜桃伊人久久| 久久人人97超碰国产公开结果| 日本亚洲欧洲无免费码在线| 日韩精品视频在线看| 亚洲区第一页| 99久久亚洲精品蜜臀| 亚洲bt欧美bt精品777| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲一区观看| 日韩精选在线| av中文资源在线资源免费观看| 欧美国产另类| 久久精品官网| 欧美日本久久| 国产99久久| 亚洲免费毛片| 五月天av在线| 亚洲人成毛片在线播放女女| 国产极品一区| 欧美日韩水蜜桃| 色8久久久久| av亚洲一区二区三区| 亚洲专区在线| 国产成人免费精品| 不卡av一区二区| 午夜亚洲福利| 日韩在线视频精品| 蜜臀91精品一区二区三区| 欧美精品第一区| 六月天综合网| 亲子伦视频一区二区三区| 亚洲不卡视频| 91tv亚洲精品香蕉国产一区| 日韩不卡一区二区三区| 成人日韩精品| 亚洲天堂av资源在线观看| 精品视频在线你懂得| 日韩精品一区第一页| 香蕉视频成人在线观看| 久久国产精品久久久久久电车| 国产精品1区| 日韩在线欧美| 日韩精品专区| 国产精品自在| 久久亚洲欧洲| 国产精品外国| 亚洲一区二区三区四区五区午夜| 激情综合亚洲| 日韩综合小视频| 在线看片国产福利你懂的| 91久久亚洲| 亚洲女同一区| 国产精品宾馆| 麻豆一区二区在线| 蜜乳av另类精品一区二区| 日韩在线观看| 日韩国产欧美在线视频| 欧美日韩国产一区二区三区不卡| 日产午夜精品一线二线三线| 亚欧洲精品视频在线观看| 麻豆精品蜜桃| 欧美黄色一区| 欧美偷窥清纯综合图区| 99视频精品全部免费在线视频| 国产精品探花在线观看| 一区二区三区四区精品视频| 日本不卡免费高清视频在线| 久久99偷拍| 日韩激情网站| 亚洲午夜黄色| 欧美影院三区| 亚洲啊v在线| 国产精品国产一区| 精品国产乱码久久久久久樱花| 国产欧美日韩影院| 日韩av不卡在线观看| 亚洲欧洲av| 亚洲三级精品| 中文字幕视频精品一区二区三区| 欧美日韩激情在线一区二区三区| 视频小说一区二区| 欧美日韩尤物久久| 亚洲性图久久| 伊人久久亚洲热| 99pao成人国产永久免费视频 | 久久精品超碰| 国产欧美日韩在线一区二区 | 亚洲综合中文| 亚洲精品观看| 国产亚洲电影| 久久精品国产亚洲一区二区三区| 久久久久黄色| 岛国av免费在线观看| 国产一区二区三区四区二区| 国产福利亚洲| 成人在线超碰| 久久久久久久久久久妇女| 久久亚洲在线| 久久亚洲欧洲| 热久久久久久| 精品资源在线| 久久精选视频| 亚洲欧美成人综合| 美美哒免费高清在线观看视频一区二区| 国产一级一区二区| 亚洲精品人人| 欧美国产中文高清| 欧美国产小视频| 欧美日韩中文一区二区| 亚洲二区在线| 蜜桃视频在线观看一区| 国产精品亚洲一区二区在线观看| 在线看片日韩| 麻豆亚洲精品| 免费福利视频一区二区三区| 欧洲精品一区二区三区| 日韩高清欧美激情| 日本在线视频一区二区| 老牛影视精品| 激情综合激情| 一本大道色婷婷在线| 69堂精品视频在线播放| 中文一区一区三区免费在线观 | 国产精品国产三级国产在线观看| 亚洲美女久久精品| 日本不卡一二三区黄网| 99国产精品久久久久久久| 99视频精品视频高清免费| 精品视频亚洲| jizzjizz中国精品麻豆| 欧美精品高清| 欧美日韩国产探花| 免费久久99精品国产| 性欧美69xoxoxoxo| 一区二区三区四区在线看| 亚洲福利国产| 精品少妇一区| 国产精品igao视频网网址不卡日韩 | 久久久男人天堂| 激情综合网五月| 久久亚洲国产精品一区二区| 美腿丝袜亚洲一区| 日本韩国欧美超级黄在线观看| 亚洲最新av| 日韩国产专区| 亚洲+小说+欧美+激情+另类| 国产精品黑丝在线播放| 伊人精品久久| 老司机免费视频一区二区三区| 99久久精品费精品国产| 欧美三级第一页| 国产91精品对白在线播放| 中文在线日韩| 高潮一区二区| 日本成人在线视频网站| 在线观看精品| 欧美在线91| 亚洲免费观看| 色婷婷综合网| 91精品福利观看| 亚洲一区网站| 美女av在线免费看|