spring提倡的就是面向接口编程,DAO和service都定义为接口。
spring中的IOC功能,要在service层中定义dao的实例,当然不用new出来,我们就通过spring的IOC把这里的dao层注入进来。不要忘了对dao提供set。Get方法,因为IOC的底层其实就是利用反射机制实现的,他把dao注入进来,其实底层就是通过反射set进来的。
我们的spring容器——ClassPathXmlApplicationContext:通过这个容器,我们就实现了IOC的功能
- public class ClassPathXmlApplicationContext implements BeanFactory {
- private Map<String, Object> beans = new HashMap<String, Object>(); //放配置文件里解析来的一个个bean
- public ClassPathXmlApplicationContext() throws Exception, Exception {
- SAXBuilder sb = new SAXBuilder();
- Document doc = sb.build(this.getClass().getClassLoader()
- .getResourceAsStream("beans.xml")); // 构造文档对象
- Element root = doc.getRootElement(); // 获取根元素HD
- List list = root.getChildren("bean");// 取名字为disk的所有元素
- for (int i = 0; i < list.size(); i++) {
- Element element = (Element) list.get(i);
- String id = element.getAttributeValue("id");
- String clazz = element.getAttributeValue("class");
- Object o = Class.forName(clazz).newInstance();
- System.out.println(id);
- System.out.println(clazz);
- beans.put(id, o);
- for (Element propertyElement : (List<Element>) element
- .getChildren("property")) {
- String name = propertyElement.getAttributeValue("name"); // userDAO
- String bean = propertyElement.getAttributeValue("bean"); // u
- Object beanObject = beans.get(bean);// UserDAOImpl instance
- String methodName = "set" + name.substring(0, 1).toUpperCase()
- + name.substring(1);
- System.out.println("method name = " + methodName);
- Method m = o.getClass().getMethod(methodName,
- beanObject.getClass().getInterfaces()[0]);
- m.invoke(o, beanObject);
- }
- }
- }
- @Override
- public Object getBean(String id) {
- return beans.get(id);
- }
- }
SPRING IOC就是我们对象的查找、依赖等,不用我们自己去NEW ,而现在作为配置文件配置在XML中,而spring通过配置文件,遍历所有BEAN,取得bean然后一个一个的newInstance(),和new一样一样的。也就是用到了java的反射原理。