您的位置:首页 > 其它

自己动手实现@Autowired注解

2017-03-17 12:34 507 查看
要自己实现@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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息