注解|自己动手实现@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; }

【注解|自己动手实现@Autowired注解】五、测试是否成功注入
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 */

    推荐阅读