菜鸟看spring源码(0)之BeanFactory的注册与依赖绑定
2014-08-23 09:26
686 查看
先贴几个基本类:
代码清单1#User类
代码清单2#UserDao.java
代码清单3#UserService.java
下面开始测试用例
在代码中实现beanfatory的注入与依赖绑定,基本让人明白getBean方法大概是个什么过程
接口BeanDefinitionRegistry实现了DefaultListableBeanFactory接口,
DefaultListableBeanFactory实现了BeanFactory接口。
代码清单4#test.java 通过代码实现beanfatory的注入与依赖绑定
通过xml配置文件实现,debug也就是从这段代码开始了,,,解析“classpath:userservice.xml”字符串,通过resource接口读取资源(在这里是classpathResouce),解析bean标签,生成对应BeanDefinition ,, ,当然需要适当取舍,不然代码太多一下根本看不完,关键是不一定看得懂
代码清单5#TestFromXML.java 通过xml配置文件
待续,,,
代码清单1#User类
package test; public class User{ private String name; User(){} User(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
代码清单2#UserDao.java
package test; public class UserDao{ public void add(User user){ System.out.println("添加user:"+user.getName()); } }
代码清单3#UserService.java
package test; public class UserService{ private UserDao userDao; UserService(){ } UserService(UserDao userDao){ this.userDao = userDao; } public void add(User user){ userDao.add(user); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; }; }
下面开始测试用例
在代码中实现beanfatory的注入与依赖绑定,基本让人明白getBean方法大概是个什么过程
接口BeanDefinitionRegistry实现了DefaultListableBeanFactory接口,
DefaultListableBeanFactory实现了BeanFactory接口。
代码清单4#test.java 通过代码实现beanfatory的注入与依赖绑定
package test; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; public class Test { public static void main(String[] args) { DefaultListableBeanFactory beanRegister = new DefaultListableBeanFactory(); BeanFactory beanfactory = getFactory(beanRegister); UserService userService = (UserService) beanfactory.getBean("userService"); userService.add(new User("test")); } public static BeanFactory getFactory(BeanDefinitionRegistry registry){ AbstractBeanDefinition userDao = new RootBeanDefinition(UserDao.class); AbstractBeanDefinition userService = new RootBeanDefinition(UserService.class); //将bean注册到容器中 registry.registerBeanDefinition("userDao", userDao); registry.registerBeanDefinition("userService", userService); //绑定依赖关系 //1.通过构造方法注入 ConstructorArgumentValues argValues = new ConstructorArgumentValues(); argValues.addIndexedArgumentValue(0, userDao); //argValues.addIndexedArgumentValue(1, ...); userService.setConstructorArgumentValues(argValues); //2.通过setter方法注入 MutablePropertyValues propertyValues = new MutablePropertyValues(); propertyValues.addPropertyValue("userDao", userDao); userService.setPropertyValues(propertyValues); //绑定完成 return (BeanFactory) registry; } }
通过xml配置文件实现,debug也就是从这段代码开始了,,,解析“classpath:userservice.xml”字符串,通过resource接口读取资源(在这里是classpathResouce),解析bean标签,生成对应BeanDefinition ,, ,当然需要适当取舍,不然代码太多一下根本看不完,关键是不一定看得懂
代码清单5#TestFromXML.java 通过xml配置文件
package test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; public class TestFromXMl { public static void main(String[] args) { DefaultListableBeanFactory beanRegister = new DefaultListableBeanFactory(); BeanFactory beanfactory = getFactory(beanRegister); UserService userService = (UserService) beanfactory.getBean("userService"); userService.add(new User("test")); } private static BeanFactory getFactory(DefaultListableBeanFactory beanRegister) { XmlBeanDefinitionReader xmlBeanReader = new XmlBeanDefinitionReader(beanRegister); xmlBeanReader.loadBeanDefinitions("classpath:userService.xml"); return beanRegister; } }代码清单6#userService.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="userService" class="test.UserService" > <constructor-arg index="0"> <ref bean="userDao"/> </constructor-arg> </bean> <bean id="userDao" class="test.UserDao"></bean> </beans>
待续,,,
相关文章推荐
- Spring源码阅读-BeanFactory-循环依赖
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
- spring beans源码解读之--BeanFactory的注册
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
- spring的BeanFactory和ApplicationContext源码详解(二)
- spring 源码解读与设计详解:4 DefaultListableBeanFactory及资源载入
- spring 源码解读与设计详解:3 FactoryBean
- spring源码初步学习-容器(BeanFactory)基本实现
- Spring IoC 依赖注入 BeanFactory ApplicationContext WebApplicationContext
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
- Spring源码之AbstractAutowireCapableBeanFactory
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
- spring源码之XmlBeanDefinitionReader与bean的注册
- spring beans源码解读之--XmlBeanFactory
- spring源码探究---beanFactory为bean对象设置属性时涉及到的类型转换
- spring的BeanFactory和ApplicationContext源码详解(一)
- spring的BeanFactory和ApplicationContext源码详解(二)
- Spring源码分析之XmlbeanFactory继承关系图
- 【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)