我的上一篇文章上面有比较详细的说角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 属性注入详解相关推荐

  1. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)

    Spring 注入(Injection) 什么是注入? 为什么要注入? 如何进行注入[开发步骤] Spring注入的原理分析(简易版) Set注入详解 JDK内置类型 String+8种基本类型 数组 ...

  2. php property 获取,JavaScript中如何获取和设置property属性代码详解

    JavaScript中对象的property有三个属性: 1.writable.该property是否可写. 2.enumerable.当使用for/in语句时,该property是否会被枚举. 3. ...

  3. 企业分布式微服务云SpringCloud SpringBoot mybatis (二)Spring Boot属性配置文件详解...

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...

  4. Spring Boot属性配置文件详解

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...

  5. (拿来主义-8) Spring Boot属性配置文件详解(三)

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...

  6. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  7. Spring 3.0 注解注入详解

    Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...

  8. Spring EL表达式使用详解

    Spring EL表达式使用详解 什么是Spring EL表达式 注入字面值 注入操作系统(OS)的属性 注入properties配置文件中数据 Bean属性调用 Bean方法调用 T运算符 构造器 ...

  9. Spring和Redis整合详解

    Spring和Redis整合详解 官方主页 Spring Spring Redis 概述 Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理. 简单来说,它是一个以(ke ...

最新文章

  1. 论文笔记 Medical Entity Linking using Triplet Network
  2. python中的is
  3. php 循环从数据库分页取数据批量修改数据
  4. 计算机网络按定义分,计算机网络定义及其分类
  5. 0116互联网新闻 | “DaDa英语”近日完成2.55亿美元D轮融资;腾讯推今年首个手游“闹闹天宫”...
  6. 为什么说Android才是游戏开发者的乐土?
  7. 积跬步,聚小流-------js实现placeholder的效果
  8. FXML:使用BuilderFactory的自定义组件
  9. mysql日志查询指令_MySQL查询日志总结
  10. des和aes相比较有哪些特点_栓流气力输送相比较传统的高速气力输送方式而言,有哪些优势?...
  11. 找mysql软件的配置文件_mysql 查看当前使用的配置文件my.cnf的方法
  12. CSRF手工测试方法
  13. java非负整数怎么设_使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法...
  14. 属性值动态调整_【第1603期】CSS 自定义属性:使用篇
  15. 数据库备份和事务日志备份
  16. 拓端tecdat|R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例
  17. spine骨骼动画基础一文通
  18. bt5 mysql字典,backtrack5下载
  19. 计算机D盘无法读取,D盘目录或文件被损坏且无法读取的愿意以及解决办法
  20. java毕业生设计疫苗药品批量扫码识别追溯系统计算机源码+系统+mysql+调试部署+lw

热门文章

  1. 建筑CAD制图:如何按各专业要求转条件图?
  2. Kubernetes network namespace位置在哪里?
  3. Java时间格式保存出错处理:java.util.Date,typeMismatch
  4. Ubuntu/Linux下自动获取最佳GPU编号的脚本
  5. Excel-动态环形图
  6. 数据结构栈的基本操作(C语言)
  7. Android 读取excel (支持 xls和xlsx)
  8. java使用Jacob合并word
  9. MX-6924F5 高通QCN9024/5GHz/4x4 MIMO/802.11a/n/ac/ax/WiFi6模块
  10. C#实现信用卡用户还款功能