自己动手实现@Autowired注解

要自己实现@Autowired注解,首先需要了解反射机制和自定义注解。本文中只简单解释用到的地方。
由于还没有了解解析XML文件,所以还没有实现自动扫描,这里的注解是手动扫描的。
文中有很多不足之处还请多多指教。


一、首先,写一个自己的注解。

//@Target元注解表示允许这个注解可以使用的范围,这里我们只完成域的作用范围。
//@Retention元注解在这里表示该注解保留到运行时期。
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAutowired {

}

二、随意创建一个类AMybean

//类中随意写了一个方法
public class AMybean {
    public int adds(int a,int b){
        return a+b;
    }
}

三、创建一个类,在类中使用自定义注解注入AMybean

public class BMybean {
    @MyAutowired//使用自定义注解
    public AMybean a;//注意这里并没有给a赋值
    public void la(){//使用a的方法
        System.out.print(a.adds(1,2));
    }
}

四、重点:通过注解获取该域的实例对象然后赋值给<三>中定义的a

public class MyReflect {
                 //传入对象
    public static boolean setObjByFieldAnno(Object o){
        //获取Class
        Class c=o.getClass();
        /*获得域*/
        Field []fields=c.getDeclaredFields();
        //返回值用于判断是否完成这个方法
        boolean b=false;
        //遍历域
        for (Field f:fields) {
        //获取域中的注解,遍历注解
           Annotation []anns=f.getAnnotations();
            for (Annotation ann:anns) {
        //这里使用instanceof关键字,判断注解中是否包含MyAutowired
               if (ann instanceof MyAutowired){
                   System.out.println(f.getName()+"--这个域使用了我的注解");
                   //f.getGenericType():获取该域的类型
                   System.out.println(f.getGenericType().toString()+"--这个域的类型");
                   //转成Class
                   Class c2= (Class) f.getGenericType();
                   try {//创建实例
                      Object o2= c2.newInstance();
                      //这个方法是将实例注入到这个域中,详细使用请查阅JAVA API
                       f.set(o,o2);
                       System.out.println("成功注入");
                       //成功则返回true
                       b=true;
                   return b;
                   } catch (InstantiationException e) {
                       e.printStackTrace();
                   } catch (IllegalAccessException e) {
                       e.printStackTrace();
                   }

               }

            }
        }
return b;
    }

五、测试是否成功注入

public class testdemo {
    public static void main(String[] args){
        BMybean bMybean=new BMybean();
        //手动注入
     boolean b=MyReflect.setObjByFieldAnno(bMybean);
        if (b){
            bMybean.la();
        }else{
            System.out.println("getObjByFieldAnno   不正确");
        }

    }
}




/*
打印结果:
myAutowired.BMybean
a--这个域使用了我的注解
class myAutowired.AMybean--这个域的类型
成功注入
3
*/

你可能感兴趣的:(注解,自己动手)