先贴几个基本类:
代码清单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>
待续,,,