国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

使用注解,簡(jiǎn)單模擬spring ioc容器。通過注解給對(duì)象屬性注入值。

項(xiàng)目結(jié)構(gòu)

使用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 控制反轉(zhuǎn)容器,在加載類的時(shí)候創(chuàng)建 HashMap , 并存入指定對(duì)象 */private static Map<String, Object> ioc;static {try {// 初始化 IOC 容器ioc = new HashMap<String, Object>();// 反射獲得 Class 對(duì)象Class<?> clazz = Class.forName('priv.haidnor.pojo.Person');// 獲取指定注解Component componentClass = clazz.getAnnotation(Component.class);// 獲取指定注解的值String key = componentClass.name();// 通過反射創(chuàng)建對(duì)象Object object = clazz.newInstance();ioc.put(key, object);// 獲取 Java Bean 所有的字段Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 字段類型Class<?> type = field.getType();// 根據(jù)字段名生成 set 方法String filedName = field.getName();String methodName = produceSetMethodName(filedName);// 獲得 Value 注解Value valueAnnotation = field.getAnnotation(Value.class);// 獲得注解的值String theValue = valueAnnotation.value();// 構(gòu)造 Method 對(duì)象Method method = clazz.getDeclaredMethod(methodName, field.getType());// 將注解參數(shù)轉(zhuǎn)換類型Object value = typeConversion(field.getType(), theValue);// 執(zhí)行 set 方法method.invoke(object, value);}} catch (Exception e) {e.printStackTrace();}}/** * 類型轉(zhuǎn)換。將 String 字符串轉(zhuǎn)換為指定數(shù)據(jù)類型類型的值 * @param typeClass 字段類型 * @param value 注解值 * @return 字符串轉(zhuǎn)換為指定數(shù)據(jù)類型類型的值 */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);}/** * 從容器中獲得指定對(duì)象 * @param name 對(duì)象名稱 * @return IOC 容器中的對(duì)象 */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('中國(guó)')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 +’}’;}}

測(cè)試類

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

運(yùn)行程序后,控制臺(tái)輸出對(duì)象信息,可以看到從ioc容器中拿出的對(duì)象已經(jīng)成功被注解賦值

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

備注

內(nèi)置注解

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

@Deprecated:定義在java.lang.Deprecated中,此注釋可以用于修辭方法,屬性,類,表示不鼓勵(lì)程序員使用這樣的元素,通常是因?yàn)樗芪kU(xiǎn)或者存在更好的選擇.

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

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

4個(gè)元注解

元注解的作用就是負(fù)責(zé)注解其他注解,Java定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類型,他們被用來提供對(duì)其他annotation類型作說明.這些類型和它們所支持的類在java.lang.annotation包中可以找到

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

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

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

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人公开视频 | 精品视频一区二区三区免费 | 中文字幕在线乱码不卡区区 | a级毛片在线播放 | 精品久久看 | 国产精品合集久久久久青苹果 | 亚洲在线影院 | 国产视频一区二区三区四区 | 91久久另类重口变态 | 三级毛片基地 | 中文字幕亚洲日本岛国片 | 一区二区三区免费观看 | 欧美日韩一区二区三区视频在线观看 | 国产欧美曰韩一区二区三区 | 久久两性| 99国产精品九九视频免费看 | 乱子伦xxxx| 99国产在线 | 97精品国产综合久久久久久欧美 | 一级做a爰片久久毛片唾 | 91精品一区二区三区在线 | 欧美一级做一a做片性视频 欧美一级做一级爱a做片性 | 欧美成人免费全部色播 | 精品国产成人三级在线观看 | 亚洲精品久久久久久久网站 | 久久怡红院亚欧成人影院 | 国产综合久久久久影院 | 久久影院视频 | 真人毛片免费全部播放完整 | 亚洲日本一区二区三区 | 一级做a爱过程免费视 | 日韩精品一区二区三区四区 | 亚洲欧美中文日韩二区一区 | 欧美一级毛片免费观看视频 | 美女张开腿让男人桶爽动漫视频 | 91伦理视频 | 精品国产亚洲一区二区三区 | 亚洲狠狠ady亚洲精品大秀 | 欧美色欧美亚洲高清在线视频 | 亚洲码在线观看 | 午夜宅男宅女看在线观看 |