一、自定义 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>