菜鸟看spring源码(0)之BeanFactory的注册与依赖绑定

来源:互联网 发布:鸿业防排烟计算软件 编辑:程序博客网 时间:2024/05/21 12:08

先贴几个基本类:

代码清单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>

待续,,,


3 0
原创粉丝点击