自定义框架(三)—— IOC 框架

一、自定义 IOC 框架示例

1、Java 代码

(1)UserBean 类

public class UserBean {
	//定义容器保存框架创建的所有对象
	private static Map<String,Object> container = new HashMap<String,Object>();
	
	static {
		//使用dom4j解析xml文件读取bean标签,将对象创建出来用id为键,对象为值保存到容器中
		SAXReader reader = new SAXReader();
		try {
			//读取xml文件
			Document document = reader.read("src/spring1.xml");
			//获取根便签
			Element rootElement = document.getRootElement();
			//读取bean标签,得到对应对象集合
			List<Element> beans = rootElement.elements("bean");
			
			//获取bean标签中的id作为键,class对象值,并保存到容器中
			for(Element b: beans) {
				//获取id键
				String key = b.attributeValue("id");
				//获取class值
				String value = b.attributeValue("class");
				//存入容器中
				container.put(key, Class.forName(value).newInstance());
			}
			
			//根据property标签定义的依赖关系完成依赖注入
			for(Element b: beans) {
				//获取bean下的property标签
				List<Element> properties = b.elements("property");
				for(Element p: properties) {
					//需要被赋值的属性名称
					String pName = p.attributeValue("name");
					//该属性需要赋值的对象在容器里的id
					String pRef = p.attributeValue("ref");
					//从容器中拿到被依赖的对象
					Object refObject = container.get(pRef);
					
					//根据属性名称获取set方法
					//根据bean标签拿到正在循环的这个bean标签的id
					String key = b.attributeValue("id");
					//从容器中取出依赖方对象
					Object object = container.get(key);
					//获取依赖方的字节码信息
					Class c = object.getClass();
					//获取需要被赋值的属性对象
					Field field = c.getDeclaredField(pName);
					//获取该属性的set方法
					Method method=c.getDeclaredMethod("set"+pName.substring(0, 1).toUpperCase()+pName.substring(1), field.getType());
					//调用方法将被依赖对象赋值给依赖对象的目标属性
					method.invoke(object, refObject);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public Object getBean(String id) {
		return container.get(id);
	}
}

(2)Service 层 UserService 类

public class UserService {
	private UserDao userDao;
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void insert() {
		System.out.println("执行新增业务");
		userDao.insert();
	}
}

(3)Dao 层 UserDao 类

public class UserDao {
	public void insert() {
		System.out.println("执行新增数据");
	}
}

(4)Action 层 UserAction类

public class UserAction{
	public static void main(String[] args) {
		UserBean factory = new UserBean();
		UserService service = (UserService) factory.getBean("service");
		service.insert();
	}
}

2、配置文件

(1)Spring.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="service" class="com.spring.demo1.service.UserService">
        <property name="userDao" ref="dao"></property>
    </bean>
    <bean id="dao" class="com.spring.demo1.dao.UserDao"></bean>
</beans>
发布了104 篇原创文章 · 获赞 58 · 访问量 7517

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104440573
今日推荐