30岁终于看过JDOM代码了,挺开心的。
感谢北风网的spring视频,这个讲师挺平和的,该讲的知识点都讲到了。
http://wenku.baidu.com/course/study/698fa200a6c30c2259019e96
同时觉得这是java反射的最好例子,所以写在这里。
spring的所谓的注入依赖,控制反转(ioc)我感觉可以简单的理解为把创建对象这工作,交给spring,程序员在xml文件中或注解中指明信息就可以。
IOC有三种实现方式
1.通过set方法注入
2.通过构造函数注入
3.使用注解注入
这里简单演示一下同过set方法注入。
classPath下有一个bean.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="studentsDao" class="dao.ipml.StudentsDaoImpl"/> <bean id="studentsService" class="service.StudentService"> <property name="studentsDao" bean="studentsDao"/> </bean> </beans>
这其中第一个bean,作为属性注入到第二个bean中,不用被名字迷惑,只是简单总结一下而已。
第一个bean的接口:
package dao; public interface StudentsDao { public void saveStudents(); }
实现类:
package dao.ipml; import dao.StudentsDao; public class StudentsDaoImpl implements StudentsDao { @Override public void saveStudents() { System.out.println("保存成功!!!!"); } }
被注入的类
package service; import dao.StudentsDao; public class StudentService { private StudentsDao studentsDao; public StudentsDao getStudentsDao() { return studentsDao; } public void setStudentsDao(StudentsDao studentsDao) { this.studentsDao = studentsDao; } public void saveStudents() { studentsDao.saveStudents(); } }
下面就是模拟srping依赖注入的类
package mySrping; 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; public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext(String xml) throws Exception { SAXBuilder sb = new SAXBuilder(); // 构造文档对象 Document doc = sb.build(this.getClass().getClassLoader() .getResourceAsStream("beans.xml")); // 获取根元素ID Element root = doc.getRootElement(); // 获取此根元素的所有子元素 List list = (List) root.getChildren("bean"); for (int i = 0; i < list.size(); i++) { Element e = (Element) list.get(i); String id = e.getAttributeValue("id"); String clazz = e.getAttributeValue("class"); Object o = Class.forName(clazz).newInstance(); beans.put(id, o); for (Element pe : (List<Element>) e.getChildren("property")) { String name = pe.getAttributeValue("name"); String bean = pe.getAttributeValue("bean"); Object beanObject = beans.get(bean); String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); Method method = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); method.invoke(o, beanObject); } } } @Override public Object getBean(String id) { return beans.get(id); } }
测试类是这样的:
package testService; import service.StudentService; import mySrping.BeanFactory; import mySrping.ClassPathXmlApplicationContext; import junit.framework.TestCase; public class TestStudentsService extends TestCase { public void testSaveStudents() throws Exception { BeanFactory beanFactory = new ClassPathXmlApplicationContext( "beans.xml"); StudentService ss = (StudentService) beanFactory .getBean("studentsService"); ss.saveStudents(); } }
java反射是什么,我感觉最原始的解释是,java可以在知道类名的情况下通过Class.forName(clazz).newInstance();直接得到实例,然后调用其方法。
反射的关键作用是,它是在运行时装配的,而在类中并没有关联。怎么实现呢?就下面这两行代码。
最难理解的是这两句代码
Method method = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]); method.invoke(o, beanObject);
o是一个对象,它通过Class.forName(clazz).newInstance();来的到
.getClass()可以获得实例的类型类
.getMethod()可以获得这个类的方法,两个参数第一个是方法名,第二个事参数类型,这里只有一个参数也就是注入bean的第一个接口
第二句就是执行这个方法
第一个参数是哪个对象来执行这个方法
第二个参数是执行这个方法需要的参数
相关推荐
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
基于java简单模拟实现spring_ioc
模拟实现spring IOC AOP的例子,如果你是eclipse开发工具,解压直接导入就可以,别忘了,导入dom4j的jar包。
NULL 博文链接:https://lgd-java2eye.iteye.com/blog/759878
这是个模拟spring ioc的学习例子,是个java工程。有助于对aop和ioc的理解
SpringIOC和AOP实现机制模拟,来自与网络。
NULL 博文链接:https://zhengshuo.iteye.com/blog/573192
基于xml注册,简单模拟spring ioc容器。快速理解ioc容器
自己实现的简易的模拟Spring的IoC容器,实现注解自动装配
简单模拟spring ioc技术,一个小demo,希望对您理解ioc有所帮助.
Spring IOC AOP MVC 简单例子
该代码主要用于spring IOC的实现(墨者革离),模拟一个城门叩问的编剧场景
手写springIOC 通过jdom读取xml文件 适合新手使用。
练习共三部分: 1、XML读取,用于配置文件读取 2、模拟SPRING IOC 3、模拟STRUTS
经过我整理了,写好了详细的注释,开发环境是myeclipse,希望对spring初学者能有帮助,大家相互帮助,谢谢!
模拟spring框架的ioc功能,简单实用的实现,高效。
自己写了一个Spring IoC的模拟,有详细注释,可供刚入门学习spring的童鞋加深理解.
以注解方式模拟Spring_IoC,AOP,看完后可以加深理解Spring的实现.
NULL 博文链接:https://justsee.iteye.com/blog/1298861