java用Annotation注入到成员Bean对象
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();
}
}
}
五、小结
总体思想就是:
- 得到想要注解的对象
- 得到该对象的setter
- 读取setter上annotation上的值并注入到对象上
- 把装配完之后的对象赋给所有者
本来一直以为注解只是给编译器检查代码用的,没想到利用反射能做这么多事,这种惊叹和博主刚接触C++的宏编程时类似,感觉奇妙无比。
java用Annotation注入到成员Bean对象的更多相关文章
- spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...
- Java—JSON串转换成实体Bean对象模板
介绍 模板需求说明 开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的. 依赖 <dependency> <groupId& ...
- Spring IOC的Bean对象
---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...
- java 从spring容器中获取注入的bean对象
java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...
- java多线程中注入Spring对象问题
web应用中java多线程并发处理业务时,容易抛出NullPointerException. 原因: 线程中的Spring Bean没有被注入.web容器在启动时,没有提前将线程中的bean注入,在线 ...
- [zhuanzai]Bean对象注入失败 .NoSuchBeanDefinitionException: No qualifying bean of type..
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying b ...
- Java(多)线程中注入Spring的Bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- 【转】Java(多)线程中注入Spring的Bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...
随机推荐
- axiso基本使用及python接收处理
安装$ npm install axios 1.发送get请求: axios.get("/api/v1.0/cars?id=132").then(function(res){ co ...
- 【3】Zookeeper中的角色
一.Zookeeper角色的分类 领导者(leader) Leader服务器为客户端提供读服务和写服务. 学习者(learner) 跟随者(follower) Follower服务器为客户端提供读服务 ...
- centos 7 源代码搭建部署 zabbix-4.0.13 LTS
Zabbix 官网 >:https://www.zabbix.com/download 源代码地址>:https://www.zabbix.com/cn/download_sources# ...
- Yii2 DatePicker时间选择器的使用
bootstrap-Date Time Picker 详细配置请参考http://www.bootcss.com/p/bootstrap-datetimepicker/ use kartik\widg ...
- 初始Ajax学习笔记
前端: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!--引入 ...
- BZOJ4777 [Usaco2017 Open]Switch Grass[最小生成树+权值线段树套平衡树]
标题解法是吓人的. 图上修改询问,不好用数据结构操作.尝试转化为树来维护.发现(不要问怎么发现的)最小生成树在这里比较行得通,因为最近异色点对一定是相邻的(很好想),所以只要看最短的一条两端连着异色点 ...
- 1024·程序员节来啦!MyEclipse致敬改变世界的程序猿
1024·程序员狂欢季 MyEclipse/CodeMix — Java开发利器!现金红包免费领! 快拆开看你的最大优惠券是多少,幸运奖红包翻倍! (活动期间在线下单的客户才可享受此优惠,过期恢复 ...
- c++使用初始化列表来初始化字段
#include<iostream> using namespace std; class Student1 { private: int _a; int _b; public: void ...
- 如何理解JS内的Truthy值和Falsy值
跟据MDN的术语表解释如下: 在 JavaScript 中,Truthy (真值)指的是在 布尔值 上下文中转换后的值为真的值.所有值都是真值,除非它们被定义为 falsy (即除了 false,0, ...
- Confluence 6 删除一个附加的文件
你需要具有 删除附件(Delete Attachment)的空间权限来删除一个附加的文件. 希望删除一个附加文件的所有版本: 进入含有附件的页面中. Go to > Attachments 选 ...