spring property 属性注入详解
我的上一篇文章上面有比较详细的说角getBean的流程。其中对propery注入的过程通过画的流程图比较清楚的展现出来。最终是通过BeanWrapperImpl类的setValue方法来完成property注入。但是究竟是怎么样获取method然后invoke的,还不太清楚。我的想法是代码里面应该有set+Name 和get+ Name进行组合字符串的操作,但实际上并不是这样的。流程是这样的先看流程图
1.我们首先来看bean对象的创建
到instantiatebean这个函数就是实际生成bean对象了,其中beanInstance就是生成的实际的bean对象。然后用它生成一个BeanWrapperImpl对象。看里面干了些什么
什么也没干,就是把这对象传给了父类。再跟踪到父类
然后就是setWrappedInstance函数调用看做了些什么
看到了吧,存放到成员变量wrappedObject里面了。这个要记住等会要用到。
我在上遍文章上有介绍.注入最后调用的是setValue方法。那么谁来调用?看截图
ph调用的,那么它又是什么。跟踪到getLocalPropertyHandler里面去
到这里就比较清楚了,是调用CachedIntrospectionResults类中的getPropertyDescriptor的方法,跟踪进去
到这里就一切都清楚了。它使用的是java的内省(Introspector) 那一套机制。网上查了下内省的基本API
JDK内省类库:
PropertyDescriptor类:(属性描述器)
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1. getPropertyType(),获得属性的Class对象;
2. getReadMethod(),获得用于读取属性值的方法;
3. getWriteMethod(),获得用于写入属性值的方法;
4. hashCode(),获取对象的哈希值;
5. setReadMethod(Method readMethod),设置用于读取属性值的方法;
6. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
可知一个 PropertyDescriptor对象就是一个具体的属性。它包括getattr setattr propertyname.所以只要从一开始把类所有的属性全读取到上面那个hashmap中去,我们就可以通过propertyName轻松获取 PropertyDescriptor对象。然后再通过getWriteMethod获取写属性方法,直接就invoke就好了。一切看起来都很简单,那个初始化是再哪里做的呢。看这上面那个截图
在获取 PropertyDescriptor的时候,需要访问cachedIntrospectionResults这个对象。最开始它肯定是null的,所以看它如何创建的
它是通过表态方法forclass生成的,传成参数如下图
看到了吧,wrappedObject就是我们创建bean的对象实例,上面已经说到了。然后来看forclass的实现
然后就是new cacheintrospectionresults对象了,看这个对象干了些什么。
看完上面一段代码应该全明白了吧,大体过程简写如下
beaninfo = Introspector.getBeanInfo(beanClass));
PropertyDescriptor[] pds = this.beanInfo.getPropertyDescriptors();
this.propertyDescriptorCache.put(pd.getName(), pd);
这里就是填充hashmap的地方propertyDescriptorCache就是那个hashmap对象,后面我们只需要传入property Name就可以获取PropertyDescriptor对象。然后
Method method = PropertyDescriptor.getWriteMethod();
method.invoke(value)就可以了。
但是到这里我还是有点不明白,在ProxyFactoryBean工厂类面属性
private String targetName;
只有写入方法setTargetName,没有读取方法,不是说规则是一定要成对出现么。
另外在property配置里面一般并没有写成targetName,还是直接target没后面的name。怎么也能正常工作,这里想不明白。最后贴一代aop的示例代码,能够正常运行。
testAOP.java
package spring_study;
public interface testAOP {
void baby();
}
AopImpl .java
package spring_study;
public class AopImpl implements testAOP {
String Message;
@Override
public void baby() {
System.out.println(Message);
}
public void setMessage(String msg) {this.Message = msg;
}
}
MyBefore .java
package spring_study;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBefore implements MethodBeforeAdvice{
@Override
public void before(Method method,Object[] args ,Object target)throws Throwable{System.out.println("this is my before");
}
}
Testapp .java
package spring_study;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testapp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("TestAOP.xml");testAOP obj = (testAOP) context.getBean("aServiceImplProxy");obj.baby();//System.out.println(obj);}
}
xml配置如下
<?xml version="1.0" encoding="UTF-8"?>
myBefor
spring property 属性注入详解相关推荐
- 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)
Spring 注入(Injection) 什么是注入? 为什么要注入? 如何进行注入[开发步骤] Spring注入的原理分析(简易版) Set注入详解 JDK内置类型 String+8种基本类型 数组 ...
- php property 获取,JavaScript中如何获取和设置property属性代码详解
JavaScript中对象的property有三个属性: 1.writable.该property是否可写. 2.enumerable.当使用for/in语句时,该property是否会被枚举. 3. ...
- 企业分布式微服务云SpringCloud SpringBoot mybatis (二)Spring Boot属性配置文件详解...
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...
- Spring Boot属性配置文件详解
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...
- (拿来主义-8) Spring Boot属性配置文件详解(三)
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...
- spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)
spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...
- Spring 3.0 注解注入详解
Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...
- Spring EL表达式使用详解
Spring EL表达式使用详解 什么是Spring EL表达式 注入字面值 注入操作系统(OS)的属性 注入properties配置文件中数据 Bean属性调用 Bean方法调用 T运算符 构造器 ...
- Spring和Redis整合详解
Spring和Redis整合详解 官方主页 Spring Spring Redis 概述 Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理. 简单来说,它是一个以(ke ...
最新文章
- 论文笔记 Medical Entity Linking using Triplet Network
- python中的is
- php 循环从数据库分页取数据批量修改数据
- 计算机网络按定义分,计算机网络定义及其分类
- 0116互联网新闻 | “DaDa英语”近日完成2.55亿美元D轮融资;腾讯推今年首个手游“闹闹天宫”...
- 为什么说Android才是游戏开发者的乐土?
- 积跬步,聚小流-------js实现placeholder的效果
- FXML:使用BuilderFactory的自定义组件
- mysql日志查询指令_MySQL查询日志总结
- des和aes相比较有哪些特点_栓流气力输送相比较传统的高速气力输送方式而言,有哪些优势?...
- 找mysql软件的配置文件_mysql 查看当前使用的配置文件my.cnf的方法
- CSRF手工测试方法
- java非负整数怎么设_使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法...
- 属性值动态调整_【第1603期】CSS 自定义属性:使用篇
- 数据库备份和事务日志备份
- 拓端tecdat|R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例
- spine骨骼动画基础一文通
- bt5 mysql字典,backtrack5下载
- 计算机D盘无法读取,D盘目录或文件被损坏且无法读取的愿意以及解决办法
- java毕业生设计疫苗药品批量扫码识别追溯系统计算机源码+系统+mysql+调试部署+lw
热门文章
- 建筑CAD制图:如何按各专业要求转条件图?
- Kubernetes network namespace位置在哪里?
- Java时间格式保存出错处理:java.util.Date,typeMismatch
- Ubuntu/Linux下自动获取最佳GPU编号的脚本
- Excel-动态环形图
- 数据结构栈的基本操作(C语言)
- Android 读取excel (支持 xls和xlsx)
- java使用Jacob合并word
- MX-6924F5 高通QCN9024/5GHz/4x4 MIMO/802.11a/n/ac/ax/WiFi6模块
- C#实现信用卡用户还款功能