要自己实现@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
*/