通过反射模拟springIoc

模拟springIOC

1.jar包准备


通过jdom读取配置文件

2.目录结构在这里插入图片描述

3.Dao层

// An highlighted block
public interface UserDao {
  public void save(User user);
}

4.DaoImpl层

// An highlighted block
public class UserDaoImpl implements UserDao {
	@Override
	public void save(User user) {
		System.out.println("用户"+user+"被保存");
	}
}

5.实体

// An highlighted block
public class User {

	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}

6.业务层

// An highlighted block
public class UserService {

	private UserDao userDao;

	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public void addUser(User u){
		this.userDao.save(u);
	}
}

7.BeanFactory

// An highlighted block
public interface BeanFactory {
	public Object getBean(String id);
}

8.配置文件

// An highlighted block
<?xml version="1.0" encoding="UTF-8"?>
<beans>
		<bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
		<bean id="userService" class="service.UserService">
		<property name="userDao" ref="userDao"></property>
		</bean>
</beans>

9.ClassPathXmlApplicationContext

// An highlighted block
public class ClassPathXmlApplicationContext implements BeanFactory{

	@Override
	public Object getBean(String id) {
		return map.get(id);
	}
Map<String,Object> map=new HashMap<String,Object>();
	public ClassPathXmlApplicationContext(String config) throws Exception{
		SAXBuilder sbx = new SAXBuilder();
		Document doc = sbx.build(this.getClass().getClassLoader().getResourceAsStream(config));
		Element root = doc.getRootElement();// 获取 <beans>  节点
		List<Element> childs = (List<Element>) root.getChildren("bean");//获取子节点<bean>
		for(Element element:childs){
			String id=element.getAttributeValue("id");//子节点<bean>上的属性id
			String clazz = element.getAttributeValue("class");//子节点<bean>上的属性class
			Class<?> forName = Class.forName(clazz);//通过反射获取字节码文件
			Object object = forName.getConstructor().newInstance();//通过类创建对象
			map.put(id,object);//将对象 id存入map中
			
			List<Element> properties = (List<Element>) element.getChildren("property");//获取<bean>下的节点property
			for(Element e:properties){
				String name = e.getAttributeValue("name");//子节点<property>上的属性name
				String ref = e.getAttributeValue("ref");//子节点<property>上的属性ref
				Object reff = map.get(ref);//根据id在map中查找对象
				String methodName = "set"+ name.substring(0,1).toUpperCase()+name.substring(1);//setUserDao()
				Method method = object.getClass().getMethod(methodName, reff.getClass().getInterfaces()[0]);//getMethod参数为方法名和方法参数类
			    method.invoke(object, reff);
			}
		}
	}
	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值