java用Annotation注入到成员Bean对象

在使用一些java框架的时候,经常看到一些注解,而且使用注解之后就可以免去一些xml的繁琐配置,本文记录如何通过注解获得成员Bean对象。

一、首先定义Bean

class Person {
private String username;
private int age; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}

二、编写和bean一致的注解

// Retention为元注解(注解的注解),这里设置了注解的生命周期为运行时
// 默认情况下,RetentionPolicy为CLASS,字节码注释一般给IDE或者一些工具看的,不能在运行时读取值
// 还有一种为SOURCE,在编译时交给编译器处理,比CLASS时间更早
@Retention(RetentionPolicy.RUNTIME)
@interface InjectPerson {
String username();
int age();
}

三、编写DAO

我们在这里注入对象

class PersonDao {
private Person person; public Person getPerson() {
return person;
} @InjectPerson(username = "Nike", age = 20)
public void setPerson(Person person) {
this.person = person;
}
}

四、利用反射生成对象并读取注解装配对象

public class TestDemo2 {

    public static void main(String[] args) {
try {
// 获取通过反射创建person
PropertyDescriptor descriptor = new PropertyDescriptor("person", PersonDao.class);
Person person = (Person) descriptor.getPropertyType().newInstance(); // 得到person成员对象的setter
Method method = descriptor.getWriteMethod(); // 得到setter的注解
Annotation annotation = method.getAnnotation(InjectPerson.class); // 得到注解的值并装配对象
Method[] methods = annotation.getClass().getMethods();
for (Method m : methods) {
String name = m.getName();
for (Field field : person.getClass().getDeclaredFields()) {
// 匹配对应字段
if (name.equals(field.getName())) {
// 读取annotation中各个属性的值 annotation.age(), 以及annotation.name()
Object value = m.invoke(annotation, null); // 得到setter
PropertyDescriptor attributeDescriptor = new PropertyDescriptor(name, Person.class);
Method setPersonMethod = attributeDescriptor.getWriteMethod(); // 装配
setPersonMethod.invoke(person, value);
}
}
} // 在把装配好的person注入到dao
PersonDao personDao = new PersonDao();
method.invoke(personDao, person); System.out.println(personDao.getPerson()); } catch (IllegalAccessException |
IntrospectionException |
InstantiationException |
InvocationTargetException e) {
e.printStackTrace();
}
}
}

五、小结

总体思想就是:

  1. 得到想要注解的对象
  2. 得到该对象的setter
  3. 读取setter上annotation上的值并注入到对象上
  4. 把装配完之后的对象赋给所有者

本来一直以为注解只是给编译器检查代码用的,没想到利用反射能做这么多事,这种惊叹和博主刚接触C++的宏编程时类似,感觉奇妙无比。

java用Annotation注入到成员Bean对象的更多相关文章

  1. spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...

  2. Java—JSON串转换成实体Bean对象模板

    介绍 模板需求说明   开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的. 依赖 <dependency> <groupId& ...

  3. Spring IOC的Bean对象

    ---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...

  4. java 从spring容器中获取注入的bean对象

      java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...

  5. java多线程中注入Spring对象问题

    web应用中java多线程并发处理业务时,容易抛出NullPointerException. 原因: 线程中的Spring Bean没有被注入.web容器在启动时,没有提前将线程中的bean注入,在线 ...

  6. [zhuanzai]Bean对象注入失败 .NoSuchBeanDefinitionException: No qualifying bean of type..

    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying b ...

  7. Java(多)线程中注入Spring的Bean

    问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...

  8. Java进阶知识17 Spring Bean对象的创建细节和创建方式

    本文知识点(目录): 1.创建细节         1) 对象创建: 单例/多例         2) 什么时候创建?         3)是否延迟创建(懒加载)         4) 创建对象之后, ...

  9. 【转】Java(多)线程中注入Spring的Bean

    问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...

随机推荐

  1. fastadmin 金额 字段类型及html验证

    金额 字段类型  整数  小数 decimal    10      2 float          10     2 html验证 <div class="form-group&q ...

  2. 8.9.网络编程_Socket 远程调用机制

    1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...

  3. CentOS 安装 elasticsearch 注意点

    注意点: 1. 从官网下载以 rpm 结尾的软件包 7.3.1版本 下载地址: https://artifacts.elastic.co/downloads/elasticsearch/elastic ...

  4. C# NET 微信临时素材上传

    最近在做这个,一开始也是不明白为什么给个URL带着两个参数就直接上传了,网上看了很多都是PHP,但是PHP没看过是不会 的 所以就一直在找网上什么Demo之类的讲解,最后还是不错找到了一个比较好理解的 ...

  5. HDU - 6223 Infinite Fraction Path (倍增+后缀数组)

    题意:给定一个长度为n(n<=150000)的字符串,每个下标i与(i*i+1)%n连边,求从任意下标出发走n步能走出的字典序最大的字符串. 把下标看成结点,由于每个结点有唯一的后继,因此形成的 ...

  6. 数据管理必看!Kendo UI for jQuery过滤器状态保持

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  7. linux 下 svn 重新定位 url

    linux下重新定位SVN URL方法:   如果更换了SVN服务器,就需要重新定位,指向新的SVN URL. 重新定位命令:svn switch --relocate 原svn地址 新svn地址   ...

  8. 决策树--CART树详解

    1.CART简介 CART是一棵二叉树,每一次分裂会产生两个子节点.CART树分为分类树和回归树. 分类树主要针对目标标量为分类变量,比如预测一个动物是否是哺乳动物. 回归树针对目标变量为连续值的情况 ...

  9. css 判断是iphone4s iphone5 加载不同样式

    @media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){/* 兼容iphone4/4s */ .class{}}@med ...

  10. Hadoop-No.8之时间戳

    要获得良好的HBase的模式设计,要正确的理解和使用时间错.在HBase中,时间戳的作用如下所述. 时间戳决定了在put请求修改记录时那些记录更新 时间戳决定了一条记录的多个版本在返回时的排序 时间戳 ...