个人对于spring依赖注入和控制反转概念的理解

其实把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>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值