其实把spring用了大概快一年了,但是一直对于spring的原理不是很清楚,最近开始看了下,感觉通常说的spring的依赖注入和控制反转的这两个概念说下自己的理解,楼主是个菜鸟理解的如果不对希望看到的能帮忙帮楼主指出来。
依赖注入(Dependency inversion):个人理解为spring通过xml中的注入的各个bean来将dao,service,action各个层管理起来,通过spring来实例化各个对象。
控制反转(Inversion of control):spring已经通过xml中的各个bean将对应的service,dao,action管理起来,然后通过BeanFactory的getBean()反射出每个bean所注入的对象实例。
以下是spring将注入的bean读取的过程(该例子虽然楼主做了改动,但是最初的思想并非楼主所写,只是由于时间长了原文的链接没有记住在这里声明例子是楼主在别处改动而来):
这是spring通过读取application配置文件中的bean的类。
package com.spring.coreTest.aop;
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;
/**
* spring得到applicationContext.Xml文件中的bean的内容的核心方法。
* @author qujianfei
*
*/
public class ClassPathXmlApplicationContext {
private Map<String,Object> beans = new HashMap<String,Object>();
public Object getBean(String id){
return beans.get(id);
}
/**
* 在spring初始化的过程中就回去读取src目录底下的名为applicationContext.xml的文件,然后去读取配置的bean已经bean底下的property,并且通过反射得到
* bean对应的实体类已经相应的方法。
* @throws Exception
*/
public ClassPathXmlApplicationContext() throws Exception{
SAXBuilder sax = new SAXBuilder();
Document dom = sax.build(this.getClass().getClassLoader().getSystemResourceAsStream("applicationContext.xml"));
Element rootelement = dom.getRootElement();
List list = (List) rootelement.getChildren("bean");
for (int i = 0; i < list.size(); i++) {
Element ele = (Element) list.get(i);
String id = ele.getAttributeValue("id");
String clazz = ele.getAttributeValue("class");
Object obj = Class.forName(clazz).newInstance();//通过类的路径来反射出类的对象
System.out.println("id==>"+id);
System.out.println("clazz==>"+clazz);
beans.put(id, obj);
List properlist = (List) ele.getChildren("property");
for (int j = 0; j < properlist.size(); j++) {
Element proele = (Element) properlist.get(j);
String name = proele.getAttributeValue("name");
String bean = proele.getAttributeValue("ref");
Object probj = beans.get(bean);
String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
System.out.println("methodName===>"+methodName);
Method m = obj.getClass().getMethod(methodName, probj.getClass().getInterfaces()[0]);
m.invoke(obj, probj);
}
}
}
public static void main(String[] args) throws Exception{
new ClassPathXmlApplicationContext();
}
}
spring中的applicationContext.xml的配置文件(由于配之间中的schema的url一直通过不了所以就把xml中的schema的相关信息删除了)
<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean id="User" class="com.spring.model.User">
</bean>
<bean id="udao" class="com.spring.dao.impl.UserDao">
</bean>
<bean id="userService" class="com.spring.service.UserService" scope="singleton">
<property name="userDao" ref="udao"></property>
</bean>
<!-- 在spring对adminservice初始化的时候调用adminservice的initAdmin方法 -->
<bean id="adminService" class="com.spring.service.AdminService" scope="prototype" init-method="intiAdmin" destroy-method="destory">
</bean>
</beans>