转载请注意出处:http://blog.csdn.net/zcm101

写在前面的话

最近,给项目组成员培训了Spring 控制反转和依赖注入的原理,并自己做了个Lazy Coder版的Spring,现在给大家分享下,相互学习,有说得不对的欢迎指正。

由于代码较多,准备分成两篇博文来写,本文先介绍如何搭建spring开发环境,并讲解一些注意的知识点。

另:我们是使用xml配置来管理bean,并没有用到注释。

Spring基本配置

1. 准备一些业务类,我们准备一个BaseDao接口,就两个方法,add和update,它有两个实现类,分别为HibernateDaoImpl和JdbcDaoImpl,再准备一个BaseService接口,也有两个方法,add和update,它有一个实现类BaseServiceImpl,在BaseServiceImpl里,我们建立两个BaseDao接口,准备分别注入HibernateDaoImpl和JdbcDaoImpl,在BaseServiceImpl类里,add方法调用HibernateDaoImpl的add方法,update调用JdbcDaoImpl的update方法。

描述比较长,但应该很清晰,具体类代码如下:

package com.lazycoder.dao;

public interface BaseDao {

	public void add();

	public void update();
}
package com.lazycoder.dao.impl;

import com.lazycoder.dao.BaseDao;

public class HibernateDaoImpl implements BaseDao {

	@Override
public void add() {
System.out.println("HibernateDaoImpl add");
} @Override
public void update() {
System.out.println("HibernateDaoImpl update");
} }
package com.lazycoder.dao.impl;

import com.lazycoder.dao.BaseDao;

public class JdbcDaoImpl implements BaseDao {

	@Override
public void add() {
System.out.println("JdbcDaoImpl add");
} @Override
public void update() {
System.out.println("JdbcDaoImpl update");
} }
package com.lazycoder.service;

public interface BaseService {

	public void add();

	public void update();
}
package com.lazycoder.service.impl;

import com.lazycoder.dao.BaseDao;
import com.lazycoder.service.BaseService; public class BaseServiceImpl implements BaseService { public BaseDao hibernateDao; /**
* 用于注入hibernateDaoImpl对象
* @param hibernateDao
*/
public void setHibernateDao(BaseDao hibernateDao) {
this.hibernateDao = hibernateDao;
} public BaseDao jdbcDao; /**
* 用于注入jdbcDaoImpl对象
* @param jdbcDao
*/
public void setJdbcDao(BaseDao jdbcDao) {
this.jdbcDao = jdbcDao;
} public void add(){
System.out.println("BaseServiceImpl add");
hibernateDao.add();
} public void update(){
System.out.println("BaseServiceImpl update");
jdbcDao.update();
}
}

2. 加入jar包,Spring依赖的基本包有下面两个:

dist/spring.jar

jakarta-commons/commons-logging.jar

2. 新建配置文件,在src目录下新建一个配置文件,名字任意,我们就叫spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="hibernateDao" class="com.lazycoder.dao.impl.HibernateDaoImpl"/> <bean id="jdbcDao" class="com.lazycoder.dao.impl.JdbcDaoImpl"/> <bean id="baseService" class="com.lazycoder.service.impl.BaseServiceImpl">
<!-- 通过name属性在baseServiceImpl里找到要注入的set方法,即 SetHibernateDao
通过ref属性在容器中找到对应id的实例化对像,即bean id="hibernateDao"... -->
<property name="hibernateDao" ref="hibernateDao"/>
<property name="jdbcDao" ref="jdbcDao"/>
</bean>
</beans>

3. 测试,新建一个Junit测试或者用main函数测试,我们使用Junit测试

package com.junit;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lazycoder.service.BaseService; public class JunitTest { @Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
BaseService baseService = (BaseService) context.getBean("baseService");
baseService.add();
baseService.update();
}
}

输出:

BaseServiceImpl add
HibernateDaoImpl add
BaseServiceImpl update
JdbcDaoImpl update

知识点讲解

1. 在项目中所有的bean,需要交给spring管理的,都需要在配置文件里,添加一个bean节点,id理论上任意,但应该规范,一般为类的接口首字母大写。class为类所在的全路径

2. service要调用dao层代码,在service中定义dao接口成员,而不是具体的dao类,我们要面向接口编程,这样我们可以通过配置来切换dao接口真正的实现类,而不需要改java代码。

3. property节点里的ref属性值,必须是在bean节点中定义过的id,这样才可以找到要注入的dao类。

4. property节点里的name属性值,spring会将它格式化成"set+首字母大写",如hibernateDao,格式化后即setHibernateDao,再到父节点bean里对应的类里BaseServiceImpl查找set方法,并注入。

5. 注入的时候是根据set方法来注入的,不是根据成员变量,也就是说我们把 public BaseDao hibernateDao;改成public BaseDao abcDao;程序依然可以运行,但是如果把public void setHibernateDao(BaseDao hibernateDao)改成public void setAbcDao(BaseDao hibernateDao),运行就会报错了

Spring IOC和DI原理讲解并制作LazyCoder版的Spring (一)的更多相关文章

  1. (转)spring IOC、DI理解

    转自: http://www.cnblogs.com/xdp-gacl/p/4249939.html 个人理解: IOC控制反转,反转的是获取依赖对象的方式.传统的应用在存在依赖关系时,比如A依赖于B ...

  2. 对Spring Ioc 以及DI的精彩理解

    转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...

  3. Spring IoC 和 DI 简介(二)

    Spring IoC 和 DI 简介 IoC:Inverse of Control(控制反转) 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 ...

  4. Spring MVC内容协商实现原理及自定义配置【享学Spring MVC】

    每篇一句 在绝对力量面前,一切技巧都是浮云 前言 上文 介绍了Http内容协商的一些概念,以及Spring MVC内置的4种协商方式使用介绍.本文主要针对Spring MVC内容协商方式:从步骤.原理 ...

  5. Spring之旅第二篇-Spring IOC概念及原理分析

    一.IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目.spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手. IOC全称Inversion of Co ...

  6. Spring 学习教程(一):浅谈对Spring IOC以及DI的理解

    一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...

  7. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  8. springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理

    SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...

  9. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

随机推荐

  1. iter, yield与enumerate的实现

    模拟实现一个enumerate函数 def myEnumerate(seq, start=0): results = [] n = start for i in seq: results.append ...

  2. selenium 学习笔记 ---新手学习记录(6) 问题总结(java)

    1.查看网页的cookie信息 //查看cookie 登录后的cookie Set<Cookie> setcoke= driver.manage().getCookies(); for(C ...

  3. 通过读取excel数据和mysql数据库数据做对比(二)-代码编写测试

    通过上一步,环境已搭建好了. 下面开始实战, 首先,编写链接mysql的函数conn_sql.py import pymysql def sql_conn(u,pwd,h,db): conn=pymy ...

  4. 扩展ASP.NET MVC HtmlHelper类

    在这篇帖子中我会使用一个示例演示扩展ASP.NET MVC HtmlHelper类,让它们可以在你的MVC视图中工作.这个示例中我会提供一个简单的方案生成Html表格. HtmlHelper类 Htm ...

  5. HDU 1983 Kaitou Kid - The Phantom Thief (2)

    神题,搜索太差,来自网络的题解与程序 思路: 封锁出口或者入口周围的格子. 最多需要4个封锁点. 所以我们可以采取这样的策略: 1.寻找一条盗贼的可行路线,如果没有,返回0. 2.计算封锁出口和入口四 ...

  6. Filter 知识总结

    Filter对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压 ...

  7. 搞不清FastCgi与PHP-fpm之间是个什么样的关系 - SegmentFault

    搞不清FastCgi与PHP-fpm之间是个什么样的关系 - SegmentFault 搞不清FastCgi与PHP-fpm之间是个什么样的关系 3赞 踩 收藏 我在网上查fastcgi与php-fp ...

  8. webservice的讲解

    Web Service实践之——开始XFire 一.Axis与XFire的比较 XFire是与Axis2 并列的新一代WebService平台.之所以并称为新一代,因为它: 1.支持一系列Web Se ...

  9. 集团财务分析BI项目中的财务系统环境

    我国集团化经营模式起步较晚,集团管控模式及管控力度各异,集团范围内财务信息化水平及统一程度不尽相同,因此在实施集团财务分析一类的BI商业智能项目的过程中,在不同的集团之间遇到的财务系统及核算数据环境也 ...

  10. mysql待整理

    1. MYSQL SQL_NO_CACHE的真正含义 http://www.dewen.org/q/5149/Mysql 是 结果不缓存,但查询还是缓存了. 如果要重新测试,就在查询前先执行一下&qu ...