[Spring3.x源码]IoC(一)例子
2012-12-31 13:42
323 查看
编写bean(Hello.java)、配置文件(beans.xml)、调用端(TestSpring.java),项目中导入spring.jar、common-logging.jar包
1.Hello.java
如果取消注释的部分则输出:Hello Spring
Spring根据配置文件中的参数,使用构造方法注入将World注入到Hello中,使用属性注入将Spring注入到Hello中。
那Spring源码中是什么时候创建hello实例,什么时候、怎么注入的?
1.先将beans.xml中的配置信息,保存到BeanDefinition的实例中。再将这些BeanDefinition放到DefaultListableBeanFactory的属性beanDefinitionMap中。发生在这一步:
AbstractApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");
2.getBean("hello");的时候就开始创建实例了。
使用Java反射机制创建bean实例,在SimpleInstantiationStrategy.instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner)或者CglibSubclassingInstantiationStrategy.instantiate(Constructor ctor, Object[] args)方法中。
3.在BeanWrapperImpl.setPropertyValue(PropertyTokenHolder tokens, PropertyValue pv)中也是用java反射调用相关的方法进行设置return readMethod.invoke(object);而这个readMethod是从PropertyDescriptor.getReadMethod()取得的(里边有一行readMethodName = "get" + getBaseName();这里就明白了setter、getter方法要遵守规范了)。
1.Hello.java
public class Hello { private String name; public Hello(){} public Hello(String args){ name = args; } public void setName(String name){ this.name = name; } public void println(){ System.out.println("Hello " + name); } }2.beans.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="hello" class="Hello"> <constructor-arg> <value>World</value> </constructor-arg> <!-- <property name="name"> <value>Spring</value> </property> --> </bean> </beans>3.TestSpring.java
import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class TestSpring { public static void main(String[] args){ AbstractApplicationContext context = new FileSystemXmlApplicationContext("beans.xml"); Hello hello = (Hello)context.getBean("hello"); hello.println(); } }运行TestSpring,输出结果:Hello World
如果取消注释的部分则输出:Hello Spring
Spring根据配置文件中的参数,使用构造方法注入将World注入到Hello中,使用属性注入将Spring注入到Hello中。
那Spring源码中是什么时候创建hello实例,什么时候、怎么注入的?
1.先将beans.xml中的配置信息,保存到BeanDefinition的实例中。再将这些BeanDefinition放到DefaultListableBeanFactory的属性beanDefinitionMap中。发生在这一步:
AbstractApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");
2.getBean("hello");的时候就开始创建实例了。
使用Java反射机制创建bean实例,在SimpleInstantiationStrategy.instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner)或者CglibSubclassingInstantiationStrategy.instantiate(Constructor ctor, Object[] args)方法中。
3.在BeanWrapperImpl.setPropertyValue(PropertyTokenHolder tokens, PropertyValue pv)中也是用java反射调用相关的方法进行设置return readMethod.invoke(object);而这个readMethod是从PropertyDescriptor.getReadMethod()取得的(里边有一行readMethodName = "get" + getBaseName();这里就明白了setter、getter方法要遵守规范了)。
相关文章推荐
- [Spring3.x源码]AOP(一)例子
- [Spring3.x源码]IoC(二)解析XML建立上下文
- [Spring3.x源码]IoC(三)实例化bean对象
- springIOC源码解析(六)
- [spring源码学习]二、IOC源码——配置文件读取
- Spring源码解读 :Ioc容器实现XmlBeanDefinitionReader篇(五)
- Spring源码学习(一):IOC容器初始化
- spring源码解析-Ioc1
- spring源码 — 一、IoC容器初始化
- 做一个合格的程序猿之浅析Spring IoC源码(二)BeanFactory初始化
- Spring源码学习IOC(4):IoC容器解析Bean定义资源并注册解析后的Bean
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
- Spring IoC 源码
- 【spring源码学习】spring的IOC容器在初始化bean过程
- Spring源码-IOC容器(五)-Bean的初始化
- Spring源码(十)-IOC终结篇
- Spring源码-IOC(一)
- 【Spring】Spring IOC原理及源码解析之scope=request、session
- 做一个合格的程序猿之浅析Spring IoC源码(一)分析前的准备和思考
- spring源码研究之路_IOC