Java仿Spring框架IOC控制反转利用反射简单实现(源码)

来源:互联网 发布:js去掉最后几个字符 编辑:程序博客网 时间:2024/05/16 16:24

效果:


xml配置文件:

运行效果:(对象为单例)


实现思路:

1.创建实体类

Student.java

package com.bean;public class Student {private int id;private String name;private String sex;private int age;private String hobby;public Student() {super();// TODO Auto-generated constructor stub}public Student(int id, String name, String sex, int age, String hobby) {super();this.id = id;this.name = name;this.sex = sex;this.age = age;this.hobby = hobby;}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 getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}}

User.java

package com.bean;public class User {private int _id;private String username;private String password;public User() {super();// TODO Auto-generated constructor stub}public User(String username, String password) {super();this.username = username;this.password = password;}public int get_id() {return _id;}public void set_id(int _id) {this._id = _id;}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;}}

2.在工程根目录新建xml配置文件beans.xml

<?xml version="1.0" encoding="UTF-8"?><beans><bean id="student" class="com.bean.Student"></bean><bean id="user" class="com.bean.User"></bean></beans>

3.核心工具类:

①Dom4j解析beans.xml,将id和class属性值保存进对象Bean

Bean类:

package com.bean;public class Bean {private String id;private String clazz;public Bean() {super();// TODO Auto-generated constructor stub}public Bean(String id, String clazz) {super();this.id = id;this.clazz = clazz;}@Overridepublic String toString() {return "Bean [id=" + id + ", clazz=" + clazz + "]";}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getClazz() {return clazz;}public void setClazz(String clazz) {this.clazz = clazz;}}

解析xml:(需要jar包dom4j)

// 获取所有xml中的所有beanpublic void getBeans() {list = new ArrayList<Bean>();// 1创建dom4j的SAX解析SAXReader sr = new SAXReader();// 2加载xml文件获取dom4j的Document对象System.out.println("getBeans:" + file.getName());try {Document document = sr.read(file);// 3获取根元素Element root_element = document.getRootElement();List<Element> bean_list = root_element.elements("bean");for (Element element : bean_list) {String id = element.attributeValue("id");String clazz = element.attributeValue("class");Bean bean = new Bean(id, clazz);list.add(bean);}for (Bean bean : list) {System.out.println(bean.toString());}} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}


②利用Java反射创建对象的方法

// 根据bean对象中的信息反射创建对象public static Object createObj(String clazz) {Object obj = null;try {Class cla = Class.forName(clazz);obj = cla.newInstance();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}

③根据Bean对象中的信息,创建出对象,保存进Map集合,为根据id得到对象准备数据

// 创建beans中所有类的对象,保存进Map集合public void createAllObj() {map = new HashMap<String, Object>();for (Bean bean : list) {String id = bean.getId();Object obj = createObj(bean.getClazz());map.put(id, obj);}}
④提供getBean方法

public Object getBean(String id) {Object obj = map.get(id);return obj;}

实现单例效果(在核心工具类创建对象时,调用方法,准备出数据)

public BeanUtils(String path) {this.path = path;file = new File(path);// 解析xml,获取bean信息getBeans();// 根据bean创建对象信息createAllObj();}

完整代码下载:

CSDN下载地址:

点击打开链接










原创粉丝点击