要自己实现@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){//获取ClassClass c=o.getClass();/*获得域*/Field []fields=c.getDeclaredFields();//返回值用于判断是否完成这个方法boolean b=false;//遍历域for (Field f:fields) {//获取域中的注解,遍历注解Annotation []anns=f.getAnnotations();for (Annotation ann:anns) {//这里使用instanceof关键字,判断注解中是否包含MyAutowiredif (ann instanceof MyAutowired){System.out.println(f.getName()+"--这个域使用了我的注解");//f.getGenericType():获取该域的类型System.out.println(f.getGenericType().toString()+"--这个域的类型");//转成ClassClass c2= (Class) f.getGenericType();try {//创建实例Object o2= c2.newInstance();//这个方法是将实例注入到这个域中,详细使用请查阅JAVA APIf.set(o,o2);System.out.println("成功注入");//成功则返回trueb=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
*/

自己动手实现@Autowired注解相关推荐

  1. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  2. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...

    作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...

  3. Spring5:@Autowired注解、@Resource注解和@Service注解

    转载:http://www.cnblogs.com/xrq730/p/5313412.html 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有 ...

  4. 解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题

    解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题 参考文章: (1)解决非controller使用@Autowired注 ...

  5. Spring学习(8)--- @Autowired注解(一)

    可以将@Autowired注解为"传统"的setter方法 package com.mypackage;import org.springframework.beans.facto ...

  6. 为什么使用Spring的@autowired注解后就不用写setter了

    问题: 在java中如果属性或者方法的标识符是private的话,是不能直接访问这个属性的,必须通过setter和getter方法才能够访问这个属性,那么使用@autowired注解来完成属性的依赖注 ...

  7. Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理

    面试官:Spring框架中的@Autowired注解可以标注在哪些地方? 小小白:@Autowired注解可以被标注在构造函数.属性.setter方法或配置方法上,用于实现依赖自动注入. 面试官:有没 ...

  8. @autowired注解原理_SpringBoot注解大全,收藏一波!!!

    一.注解(annotations)列表 二.注解(annotations)详解 三.JPA注解 四.springMVC相关注解 五.全局异常处理 <Java 2019 超神之路> < ...

  9. @autowired注解原理_相见恨晚,一个架构师也不会用的Lombok注解

    我见过很多反对Lombok的同学,背地里又偷偷的把插件添加了进去,这是真香原理在搞鬼.嘴上说不要,身体很诚实.反对的人,应该是没见过一些业务代码的冗长繁杂,还沉浸在自己病态的完美主义中. 要面对又脏又 ...

  10. @autowired注解_SpringBoot常用注解大全

    作者:tanwei81 , 链接:www.cnblogs.com/tanwei81 一.注解(annotations)列表 @SpringBootApplication: 包含了@ComponentS ...

最新文章

  1. java的InputStream和OutputStream的理解【转】
  2. 做了个第三方NTFS软RAID
  3. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略
  4. docker安装clickhouse_docker 安装ClickHouse
  5. Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
  6. java——-反省机制(代码例子)-
  7. emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
  8. Protobuf序列化的原理-varint
  9. 200924阶段一C++STL
  10. POJ - 3415 Common Substrings(后缀数组+单调栈)
  11. SQLAlchemy()分页器paginate方法
  12. python画直方图-从零开始学Python【13】--matplotlib(直方图)
  13. 通过Centos7搭建PXE安装Windows操作系统和Centos操作系统及WindowsPE维护系统
  14. IO编程 之 缓冲篇
  15. linux redis-trib.rb,redis redis-trib.rb使用密码管理集群
  16. windows server 2003 桌面图标有蓝底如何解决
  17. 计算机登录界面没有用户显示不出来,win7让administrator账户不出现在登陆界面方法...
  18. coldfusion_Coldfusion数据结构简介第IV部分–查询
  19. MacBook显示隐藏文件夹
  20. ​最适合女生的10个副业(上篇),只要你有执行力,实现财富自由很简单!

热门文章

  1. 计算机网络基础知识之应用层篇
  2. NLTK的安装/对象/词库/分词/词性标注/分块
  3. facebook 登陆失败 分享失败 原因汇总
  4. 抖音育儿类账号的创作灵感分享, 想进圈的不妨了解一下
  5. java lpad oracle_Oracle中Lpad函数和Rpad函数的用法
  6. 数据分析常用名词解释
  7. Codeforces1183 E. Subsequences (easy version)(bfs)
  8. 超宽屏幕比例_Hello!宽时代 21:9超宽屏显示器选购
  9. 遇到服务器网络偶尔断线如何检查
  10. 系统更新win10服务器出错怎么办,windows10更新升级失败0x80072ee2解决方法