自己动手实现@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){//获取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注解相关推荐
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
- @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
转载:http://www.cnblogs.com/xrq730/p/5313412.html 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有 ...
- 解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题
解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题 参考文章: (1)解决非controller使用@Autowired注 ...
- Spring学习(8)--- @Autowired注解(一)
可以将@Autowired注解为"传统"的setter方法 package com.mypackage;import org.springframework.beans.facto ...
- 为什么使用Spring的@autowired注解后就不用写setter了
问题: 在java中如果属性或者方法的标识符是private的话,是不能直接访问这个属性的,必须通过setter和getter方法才能够访问这个属性,那么使用@autowired注解来完成属性的依赖注 ...
- Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理
面试官:Spring框架中的@Autowired注解可以标注在哪些地方? 小小白:@Autowired注解可以被标注在构造函数.属性.setter方法或配置方法上,用于实现依赖自动注入. 面试官:有没 ...
- @autowired注解原理_SpringBoot注解大全,收藏一波!!!
一.注解(annotations)列表 二.注解(annotations)详解 三.JPA注解 四.springMVC相关注解 五.全局异常处理 <Java 2019 超神之路> < ...
- @autowired注解原理_相见恨晚,一个架构师也不会用的Lombok注解
我见过很多反对Lombok的同学,背地里又偷偷的把插件添加了进去,这是真香原理在搞鬼.嘴上说不要,身体很诚实.反对的人,应该是没见过一些业务代码的冗长繁杂,还沉浸在自己病态的完美主义中. 要面对又脏又 ...
- @autowired注解_SpringBoot常用注解大全
作者:tanwei81 , 链接:www.cnblogs.com/tanwei81 一.注解(annotations)列表 @SpringBootApplication: 包含了@ComponentS ...
最新文章
- java的InputStream和OutputStream的理解【转】
- 做了个第三方NTFS软RAID
- 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略
- docker安装clickhouse_docker 安装ClickHouse
- Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
- java——-反省机制(代码例子)-
- emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
- Protobuf序列化的原理-varint
- 200924阶段一C++STL
- POJ - 3415 Common Substrings(后缀数组+单调栈)
- SQLAlchemy()分页器paginate方法
- python画直方图-从零开始学Python【13】--matplotlib(直方图)
- 通过Centos7搭建PXE安装Windows操作系统和Centos操作系统及WindowsPE维护系统
- IO编程 之 缓冲篇
- linux redis-trib.rb,redis redis-trib.rb使用密码管理集群
- windows server 2003 桌面图标有蓝底如何解决
- 计算机登录界面没有用户显示不出来,win7让administrator账户不出现在登陆界面方法...
- coldfusion_Coldfusion数据结构简介第IV部分–查询
- MacBook显示隐藏文件夹
- ​最适合女生的10个副业(上篇),只要你有执行力,实现财富自由很简单!
热门文章
- 计算机网络基础知识之应用层篇
- NLTK的安装/对象/词库/分词/词性标注/分块
- facebook 登陆失败 分享失败 原因汇总
- 抖音育儿类账号的创作灵感分享, 想进圈的不妨了解一下
- java lpad oracle_Oracle中Lpad函数和Rpad函数的用法
- 数据分析常用名词解释
- Codeforces1183 E. Subsequences (easy version)(bfs)
- 超宽屏幕比例_Hello!宽时代 21:9超宽屏显示器选购
- 遇到服务器网络偶尔断线如何检查
- 系统更新win10服务器出错怎么办,windows10更新升级失败0x80072ee2解决方法