模拟spring,写自己的IOC

来源:互联网 发布:浪潮软件二级部门 编辑:程序博客网 时间:2024/05/17 01:43

1.项目结构



2.创建:User.java

package com.office.ioc.entity;/** * 用户类 *  * @author Administrator 2017-4-27 * */public class User {private int id;private String name;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", address=" + address + "]";}}

3.定义接口和实现类:UserDao.java、UserDaoImpl.java、UserService.java、UserServiceImpl.java

UserDao.java

package com.office.ioc.dao;import com.office.ioc.entity.User;public interface UserDao {void add(User user);}

UserDaoImpl.java

package com.office.ioc.dao.impl;import com.office.ioc.dao.UserDao;import com.office.ioc.entity.User;public class UserDaoImpl implements UserDao {public void add(User user) {System.out.println("user is saved !");}}

UserService.java

package com.office.ioc.service;import com.office.ioc.entity.User;public interface UserService {void add(User user);}

UserServiceImpl.java(注意getter、setter方法)

package com.office.ioc.service.impl;import com.office.ioc.dao.UserDao;import com.office.ioc.entity.User;import com.office.ioc.service.UserService;public class UserServiceImpl implements UserService {private UserDao userDao;public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void add(User user) {userDao.add(user);}}

4.通过maven引入:dom4j.jar

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>

5.定义xml:ioc-beans.xml

<?xml version="1.0" encoding="UTF-8"?><beans><bean id="userDao" class="com.office.ioc.dao.impl.UserDaoImpl"/><bean id="userService" class="com.office.ioc.service.impl.UserServiceImpl"><property name="userDao" bean="userDao"/></bean></beans>


6.最关键的部分,解析xml,通过java的反射机制实现IOC:

BeanFactory.java

package com.office.ioc.core;public interface BeanFactory {Object getBean(String id);}

ClassPathXmlApplicationContext.java

package com.office.ioc.core.impl;import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import com.office.ioc.core.BeanFactory;@SuppressWarnings("unchecked")public class ClassPathXmlApplicationContext implements BeanFactory {private Map<String, Object> beans = new HashMap<String, Object>();private String configLocation="application.xml";public ClassPathXmlApplicationContext(String configLocation)throws Exception{this.configLocation=configLocation;setConfigLocation(getDocument());}public ClassPathXmlApplicationContext() throws Exception {setConfigLocation(getDocument());}public Document getDocument() throws Exception{SAXReader sr = new SAXReader();return sr.read(sr.getClass().getClassLoader().getResourceAsStream(configLocation));// 构造文档对象}public void setConfigLocation(Document document) throws Exception{Element root = document.getRootElement();// 获取根元素HDList<Element> list = root.elements("bean");// 获取名字为bean的所有元素for (Element element : list) {String id = element.attributeValue("id");String clazz = element.attributeValue("class");Object object = Class.forName(clazz).newInstance();System.out.println("bean id is " + id + ",  class is " + clazz);beans.put(id, object);// 遍历所有的propertyfor (Element property : (List<Element>) element.elements("property")) {String name = property.attributeValue("name");String bean = property.attributeValue("bean");Object beanObject = beans.get(bean);// 构造setter方法String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);System.out.println("setter method name = " + methodName);Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);m.invoke(object, beanObject);}}}public Object getBean(String id) {return beans.get(id);}}

7.编写测试类:

package com.office.ioc;import com.office.ioc.core.impl.ClassPathXmlApplicationContext;import com.office.ioc.entity.User;import com.office.ioc.service.UserService;public class Main {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ioc-beans.xml");User student=new User();UserService service=(UserService)context.getBean("userService");service.add(student);}}









0 0
原创粉丝点击