Spring之IOC详解

学过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的内容为大家介绍到这里。

希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • 用java的spring实现一个简单的IOC容器示例代码

    要想深入的理解IOC的技术原理,没有什么能比的上我们自己实现它.这次我们一起实现一个简单IOC容器.让大家更容易理解Spring IOC的基本原理. 这里会涉及到一些java反射的知识,如果有不了解的,可以自己去找些资料看看. 注意 在上一篇文章,我说,启动IOC容器时,Spring会将xml文件里面配置的bean扫描并实例化,其实这种说法不太准确,所以我在这里更正一下,xml文件里面配置的非单利模式的bean,会在第一次调用的时候被初始化,而不是启动容器的时候初始化.但是我们这次要做的例子是容

  • MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3

    到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码: private IUserService _userService; private IUserService UserService { get { return _userService ?? (_userService = new UserService()); } set { _userService = value; }

  • Spring核心IoC和AOP的理解

    spring 框架的优点是一个轻量级笔记简单易学的框架,实际使用中的有点优点有哪些呢! 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于

  • 利用Spring IOC技术实现用户登录验证机制

    利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户的用户名和密码进行匹配. 当用户名与密码匹配成功时,跳转到登录成功页面:当用户名与密码不匹配时,跳转到登录失败的页面. 1.创建 User 对象,定义用户名和密码属性,代码如下: package com.importnew; public class User { private String us

  • Spring学习笔记1之IOC详解尽量使用注解以及java代码

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4. 一.准备工作. 1.m

  • 浅析Java的Spring框架中IOC容器容器的应用

    Spring容器是Spring框架的核心.容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期.在Spring容器使用依赖注入(DI)来管理组成应用程序的组件.这些对象被称为Spring Beans. 容器获得其上的哪些对象进行实例化,配置和组装通过阅读提供的配置元数据的说明.配置元数据可以通过XML,Java注释或Java代码来表示.下面的图是Spring如何工作的高层次图. Spring IoC容器是利用Java的POJO类和配置元数据的产生完全配置和可执行的系统或

  • 深入理解Java的Spring框架中的IOC容器

    Spring IOC的原型 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将

  • 详解Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

  • Spring boot实现一个简单的ioc(2)

    前言 跳过废话,直接看正文 仿照spring-boot的项目结构以及部分注解,写一个简单的ioc容器. 测试代码完成后,便正式开始这个ioc容器的开发工作. 正文 项目结构 实际上三四个类完全能搞定这个简单的ioc容器,但是出于可扩展性的考虑,还是写了不少的类. 因篇幅限制,接下来只将几个最重要的类的代码贴出来并加以说明,完整的代码请直接参考https://github.com/clayandgithub/simple-ioc. SimpleAutowired 代码 import java.la

  • Spring实现IoC的多种方式小结

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了. IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现Io

随机推荐