这里使用到的反射是模拟Spring框架的自动装配这一个功能,在我们没有学习Spring框架的时候,或没学反射机制的时候,通常我们创建一个类的实例都是通过new关键字来实例化一个类的,后来我们则陆续的学了java的反射机制,通过反射机制也可以实例化一个类,但是每次都要写一堆的代码,相对与来说是痛苦的,而后来我们有学习了Spring框架,它里面的依赖注入,则使用了Java的反射机制,通过配置文件,就可以实现类的实例化。
下面我们就自己模拟Spring的依赖注入这一个功能来实现,真正的Spring框架的依赖注入当然没我这个简单,这个我只是把反射机制巩固一下,方便以后使用
当然这些说的都是我自己瞎掰的,说错了的地方或写错了的地方,还请多多指教。
这个例子的步骤
1、创建一个Java项目
2、创建所需要的类
3、创建一个xml文件
第一步就免了
2、这里我创建的类有Users.java、UsersDao.java、UsersDaoImpl.java、UsersService.java、UsersServiceImpl.java、BeanFactory.java、ClassPathXmlApplicationContext.java
代码加上:
Users.java
package com.tenghu.spring.model;
public class Users {
//编号
private int id;
//姓名
private String name;
//年龄
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
UsersDao.java---接口
package com.tenghu.spring.dao;
import com.tenghu.spring.model.Users;
public interface UsersDao {
public void addUsers(Users user);
}
UsersDaoImpl.java
package com.tenghu.spring.dao.impl;
import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;
public class UsersDaoImpl implements UsersDao{
@Override
public void addUsers(Users user) {
System.out.println("添加成功");
}
}
UsersService.java
package com.tenghu.spring.service;
import com.tenghu.spring.model.Users;
public interface UsersService {
public void addUsers(Users user);
}
UsersServiceImpl.java
package com.tenghu.spring.service.impl;
import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;
public class UsersServiceImpl implements UsersService{
private UsersDao userDao;
public UsersDao getUserDao() {
return userDao;
}
public void setUserDao(UsersDao userDao) {
this.userDao = userDao;
}
@Override
public void addUsers(Users user) {
userDao.addUsers(user);
}
}
BeanFactory.java
package com.tenghu.spring.spring;
public interface BeanFactory {
//根据名称获取对象
public Object getBean(String name);
}
ClassPathXmlApplicationContext.java
package com.tenghu.spring.spring;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import com.tenghu.spring.test.Test;
public class ClassPathXmlApplicationContext implements BeanFactory {
//创建Map集合
private Map<String, Object> bean=new HashMap<String, Object>();
public ClassPathXmlApplicationContext() {
try {
//创建SAXBuilde对象
SAXBuilder builder = new SAXBuilder();
//获取文档对象
Document doc = builder.build(Test.class.getClassLoader()
.getResourceAsStream("myApplicationContext.xml"));
// 获取根节点
Element ele = doc.getRootElement();
// 获取子节点
List list = ele.getChildren("bean");
for (int i = 0; i < list.size(); i++) {
Element child = (Element) list.get(i);
String id = child.getAttributeValue("id");
String clazz = child.getAttributeValue("class");
//通过反射获取对象
Object o=Class.forName(clazz).newInstance();
//添加到集合中
bean.put(id, o);
for(Element childElement:(List<Element>)child.getChildren("property")){
//获取参数
String name=childElement.getAttributeValue("name");
String ref=childElement.getAttributeValue("ref");
//获取对象
Object obj=bean.get(ref);
//拼接set方法
String methodName="set"+name.substring(0,1).toUpperCase()+name.substring(1);
//反射获取方法
Method m=o.getClass().getDeclaredMethod(methodName, obj.getClass().getInterfaces()[0]);
m.invoke(o, obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String name) {
return bean.get(name);
}
}
3、创建xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="ud" class="com.tenghu.spring.dao.impl.UsersDaoImpl"/>
<bean id="userServiceImpl" class="com.tenghu.spring.service.impl.UsersServiceImpl">
<property name="userDao" ref="ud"/>
</bean>
</beans>
测试
package com.tenghu.spring.test;
import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;
import com.tenghu.spring.spring.BeanFactory;
import com.tenghu.spring.spring.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//创建ClassPathXmlApplicationPath对象
BeanFactory factory=new ClassPathXmlApplicationContext();
Users user=new Users();
user.setId(1);
user.setName("李四");
user.setAge(23);
UsersService us=(UsersService) factory.getBean("userServiceImpl");
us.addUsers(user);
}
}
这样整个功能就算是实现了