学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。本篇我们通过一个实例和大家简单分析一下Spring中IOC的原理,以便我们可以更好的理解Spring。

  简单描述一下我们的场景,添加新用户到数据库,这里我们采用分层的方式,进行功能的实现,我们知道,开发程序一定要注意程序的可移植性,所以这里简单为大家介绍一下面向接口编程,面向接口编程就是面向抽象编程、面向规范编程,它带来的最大的好处便是解耦、增强扩展性、屏蔽变化。

  

  好了下面我们开始我的业务实现,首先我们需要创建一个Model--UserDO.java

public class UserDO {

    private String name;
private String password; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} }

  有了我们的用户对象,下面我们开始创建Selvect类,Selvect我们知道,使用了接收用户请求的对象,这里因为我们只是为了方便大家理解,所以我们在Selvect中模拟收到用户请求后进行相关业务逻辑处理:

public class UserSelvect {

    public static void main(String[] args) {
UserDO userDO = new UserDO();
BeanFactory beanFactory = new ClassPathXmlApplicationContext();//创建我们的Bean工厂
UserService userService = (UserService) beanFactory.getBean("userService");//通过类名来获得类对象
userService.add(userDO);//完成业务逻辑
} }

  一般我们的业务逻辑会放在Service层进行操作,所以我能先来看一下我们的Service对象:

public class UserService {
private UserDao userDao;//实例DAO对象 public UserDao getUserDao() {
return userDao;
} //用于Bean工厂中进行DAO动态绑定
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} //用于Selvect对象调用,进行业务逻辑处理
public void add(User u){
userDao.add(u);
}
}

  下面就是我们的DAO层的实现了,这里就要说明了,为了最大化提高程序的可移植性,接下来将采用接口编程的实现进行设计:

/**
* DAO类只有方法定义
* 从而减低程序直接的耦合
*/
public interface UserDao { public void add(User u);
}

  既然是面向接口编程,就一定需要实现接口的类:

public class UserDaoImpl implements UserDao{

    public void add(User u){
System.out.println("保存一个学生对象");
} }

  好了到这里我们的基本框架已经完成,接下来就要开始重点的内容了,首先我们需要先了解一些关于xml解析的知识,在之前的博客中已经为大家介绍了过一种方式:Jdom读取XML文件,不了解的小伙伴可以先移步简单查看一下,这样接下来的内容,你才不至于感到吃力。下面我们进行我们的这个Demo的设计,首先在src目录下添加一个Spring.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.manyiaby.daoimpl.UserDaoImpl"></bean> <bean id="userService" class="com.manyiaby.service.UserService">
<property name="userDao" bean="userDao"></property>
</bean>
</beans>

  下面我们定义一个Bean工程对象,用来读取我们的Spring.xml文件,从而完成对象实例的创建,一便接下来的业务操作:

public interface BeanFactory {

    public Object getBean(String className);

}

  大家是不是发现我们的Bean工场也是采用接口编程的思想,接下来看一下我们的工场实现类:

public class ClassPathXmlApplicationContext implements BeanFactory{

    private Map<String, Object> beanMap = new HashMap<String, Object>();//用来存配置文件中的类对象

    public ClassPathXmlApplicationContext(){
try {
SAXBuilder saxBulder = new SAXBuilder();
Document doc = saxBulder.build(ClassPathXmlApplicationContext.class
.getClassLoader().getResourceAsStream("spring.xml"));
Element root = doc.getRootElement();//获取根元素
List<Element> list = root.getChildren("bean");
for (Element element : list) {
String id = element.getAttributeValue("id");//得到beanId
String className = element.getAttributeValue("class");//得到Bean的类名地址
System.out.println(className);
Object object = Class.forName(className).newInstance();
beanMap.put(id, object);
if (null != element.getChild("property")) {
Element property = element.getChild("property");
String name = property.getAttributeValue("name");
String beanId = property.getAttributeValue("bean");
Object beanObject = beanMap.get(beanId);//UserDaoImpl String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);//setUserDao
System.out.println(methodName); Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//UserService的SetUserDao()方法,接收的参数为UserDao接口类
m.invoke(object, beanObject);//调用UserService的SetUserDao()方法,传入UserDaoImpl
}
}
} catch (Exception e) {
System.out.println("" + e);
}
} //用于类调用
@Override
public Object getBean(String className) {
return beanMap.get(className);
} }

  简单为大家介绍一下,我们通过beanMap将我们在Spring中配置的对象,通过反射机制拿到,然后放置于beanMap对象中,通过getBean方法,共外部类调用。


  上面简单模拟了一下Spring中IOC的一些内容,下面咱们一起来看一下,如何通过Spring完成上面的操作,首先我们需要下载spring.jar,有了这个jar还不够,spring还依赖commons-logging.jar,好了将这两个jar包导入到我们的工程中,然后我们就来看一下如何实现使用:

public class UserSelvect {

    public void main() {
UserDO userDO = new UserDO();
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) beanFactory.getBean("userService"); //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//UserService userService = (UserService) context.getBean("userService"); userService.add(userDO);
} }

  其他不用修改,是不是很简单,好了,关于Spring的内容为大家介绍到这里。

Spring之IOC详解的更多相关文章

  1. Spring之IoC详解(非原创)

    文章大纲 一.Spring介绍二.Spring的IoC实战三.IoC常见注解总结四.项目源码及参考资料下载五.参考文章 一.Spring介绍 1. 什么是Spring   Spring是分层的Java ...

  2. 2、Spring的 IoC详解(第一个Spring程序)

    Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.在这句话中重点有两个,一个是IoC,另一个是AOP.今天我们讲第一个IoC. IoC概念 ...

  3. Spring.Net —IOC详解

    一. Spring.net中IOC介绍 1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中 ...

  4. (二)Spring 之IOC 详解

    第一节:spring ioc 简介 IOC(控制反转:Inversion of Control),又称作依赖注入dependency injection( DI ),是一种重要的面向对象编程的法则来削 ...

  5. Spring IoC详解

    Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...

  6. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  7. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  8. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

  9. Spring4 IOC详解

    Spring4 IOC详解 上一章对Spring做一个快速入门的教程,其中只是简单的提到了IOC的特性.本章便对Spring的IOC进行一个详解.主要从三个方面开始:基于xml文件的Bean配置,基于 ...

随机推荐

  1. Redis系列二(yum切换为网易163)

    这个可能和Redis没有直接的关系... 是我在yum install的时候发现centos的yum实在是太慢,上网查了下.网易163有个yum镜像,为了让CentOS6使用速度更快的YUM更新源,可 ...

  2. Python实现字典的key和values的交换

    #encoding=utf-8 #反转字典 即key和val互换 dict1={1:2,3:4,6:7,9:10} print '---生成器表达式' def invert_dict(d): retu ...

  3. .net 开发经理的月薪

    因为各人的成长不一样,有人工作了5年,技术也只能当个高级程序员,有人工作了两年,就能带领一个团队,有人在初中时期就写了一个很牛X 的框架,而我工作也快5年,也努力奋斗了5年,我觉得自己有能力做开发经理 ...

  4. 使用VS Code从零开始开发调试.NET Core 1.1

    使用VS Code 从零开始开发调试.NET Core 1.1.无需安装VS 2017 RC 即可开发.NET Core 1.1. .NET Core 1.1 发布也有一段时间了,最大的改动是从 pr ...

  5. ContextMenu控件引用以及不用v4包的方法

    最近想撸个APP出来玩玩,本想用Yalantis出的SideMenu,结果因为依赖问题放弃了,改用他们家的ContextMenu. 如果你用了v4包 那么问题就比较简单了,直接打开项目中app中的bu ...

  6. maven 配置安装

    1.下载maven http://maven.apache.org/   2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...

  7. OOP面向对象三大特点

    OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值,    ...

  8. 在vi或者vim中显示行号

    1. 为了显示行号,在vi/vim编辑器中执行一下命令中的一条 :set number 或者 :set nu 2. 为了关闭行号,在vi/vim编辑器中执行下面命令 :set nu! 如果你想要每次启 ...

  9. ORACLE-EXP和IMP方法介绍

    说明: 之前经常有人询问数据库导出导入的方法,去百度查询,但是查询的结果却不是很尽如人意,所以在此做个基本的总结,包括 导出:(导出用户,导出表,导出表结构不带数据,QUERY参数),导入(导入数据文 ...

  10. Windows内存管理简介:

    1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空   (2):固定空间分配:固定分 ...