仿spring的ioc实现之注解注入的小例子

来源:互联网 发布:医院大数据风控 编辑:程序博客网 时间:2024/05/20 05:56

首先,我们先写出一个自定义的注解

<span style="font-size:14px;">package com.test.aonntion;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;// 生命该注解的范围为属性@Target(ElementType.FIELD)// 表示该注解为运行时注入@Retention(RetentionPolicy.RUNTIME)public @interface Ioc {// obj传入的参数类型为object的子类的类型,默认参数为Object.classpublic Class<? extends Object> obj() default Object.class;}</span>

然后我们声明三个类  用来测试

先声明一个抽象的父类

<span style="font-size:14px;">package com.test.aonntion;public abstract class Parent {// 抽象方法public abstract void say();}</span>

在声明两个子类,继承自我们的父类

SON子类

<span style="font-size:14px;">package com.test.aonntion;public class Son extends Parent{@Overridepublic void say() {// 儿子打酱油去System.out.println("i'm my Parent's Son");}}</span><span style="font-weight: bold;"></span>


Daughter子类
<span style="font-size:14px;">package com.test.aonntion;public class Daughter extends Parent {@Overridepublic void say() {// 闺女打酱油去System.out.println("i'm my Parent's Daughter");}}</span>

接下来要完成我们的功能类的编写了

<span style="font-size:14px;">package com.test.aonntion;import java.lang.reflect.Field;public class IocTest {public static void startIoc(String objName) throws Exception{// 获取该类Class<?> clazz = Class.forName(objName);// 实例化该类的对象Object testIoc = clazz.newInstance();// 获得类下面的所有属性Field[] fields = clazz.getDeclaredFields();// 判断该类中的是否有属性if(fields != null && fields.length > 0 ){// 遍历所有的属性for(int i =0;i < fields.length; i++){// 获得当前属性的ioc注解Ioc ioc = fields[i].getAnnotation(Ioc.class);// 如果当前属性的ioc注解不为空并且obj的值不为空if( ioc != null && ioc.obj() != null ) {// 获得我们注入obj的类,并且实例化该类,得到该实例ojbObject ojb = ioc.obj().newInstance();// 让属性支持强制注入,既-当属性为私有变量并且没有set方法时// 强制调用set("属性名",要注入的属性);fields[i].setAccessible(true);// 将我们实例化的对象注入进属性内fields[i].set(testIoc, ojb);}}}}// 这是我派去打酱油的是我儿子@Ioc(obj=Son.class)// 声明一个父类对象1private static Parent parent;// 这是我派去打酱油的是我闺女@Ioc(obj=Daughter.class)// 声明一个父类对象2private static Parent parent1;/** * @param args */public static void main(String[] args) {try {// 启动注解startIoc("com.test.aonntion.IocTest");} catch (Exception e) {e.printStackTrace();}// 父亲A派出打酱油的人说parent.say();// 父亲B派出打酱油的人说parent1.say();}}</span>

测试结果



1 0
原创粉丝点击