zoukankan      html  css  js  c++  java
  • Spring IOC整理

    示例展示

    Spring的一大特点是利用配置的xml文件实现依赖注入。 所谓依赖注入是指把一个业务对象注入另一个业务对象,从而达到对象间的松耦合。(注意是业务对象哦!)
    依赖注入讲的通俗一点,就是让一个对象的创建不用new了,可以自动的生产。这其实是利用java里的反射,反射就是在运行时动态的去创建、调用对象。

    下面我们来举个例子(具体代码参见右侧源码,只适合菜鸟看)

    示例场景

    场景:现在有个磁盘输出的业务,客户端需要通过2个业务对象进行输出。 一个是通过Floppy(软盘),另一个是通过USB接口。
    如果是一般的写法,如果我们要进行磁盘输出业务,必须先new一个USB对象或者软盘对象,进行的次数多了就会非常的重复。
    我们要实现一个功能,就是磁盘输出的时候,我们只负责磁盘输出的业务逻辑,至于首先new一个新的Bean的业务和new哪一个新Bean,我们交给xml配置文件管理,这样就可以减少代码的耦合。

    示例原理图

    实现步骤

    1.首先建立一个设备接口 IDeviceWriter 类。
    2.再建立软盘和USB类来实现这个接口,分别是 FloppyWriter 类和 UsbDiskWriter 类。
    3.然后建立磁盘业务的JavaBean类,我们简称它为 BusinessBean 。 该Bean有一个成员用于存放设备-writer。 然后有get,set方法和一个核心的磁盘输出业务的方法。
    4.业务类完成之后,我们便可以在配置文件 businessFactoryConfig.xml 中进行配置依赖关系了。 (注:bean依赖关键字是ref)。关键代码如下:

    <bean id="floppy" class="spring.basic.BusinessFactory.FloppyWriter"/>    
        <bean id="usb" class="spring.basic.BusinessFactory.UsbDiskWriter"/>          
        <bean id="businessBean"      
              class="spring.basic.BusinessFactory.BusinessBean">      
            <property name="deviceWriter">    
                <ref bean="floppy"/>    
            </property>      
    </bean>     
    

    5.编写客户端代码,获得Spring中定义的Bean对象,执行save方法,查看磁盘输出时是使用了哪一种方法。
    在上面的配置文件中,如果注入了floppy bean,那么是储存至软盘… 如果注入usb bean,那么是储存至移动硬盘…

    知识准备

    什么是IOC?
    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
    从注入的方法上看,依赖注入主要可以划分为三种类型:属性注入(set注入)、构造函数注入和接口注入。由于接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式。

    三种注入方式的区别:
    1.属性注入方式:对于需要注入的东西比较明确。符合java的设计规则。更适合java开发人员,使用起来更加自然,更加方便。
    2.构造函数注入方式:在类加载的时候,就已经注入依赖的组件。但是若是参数多的话,使用起来不方便。
    3.接口注入:组件需要依赖特定接口的实现,其中的加载接口实现和接口实现的具体对象都是由容器来完成。由于需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式。

    资源准备

    1:jar包下载地址:spring jar包
    2.详细学习参考spring参考手册spring参考手册

    示例

    我们使用set注入的方法来实现一个例子,示例的过程见左侧的“示例展示”,下面是源码:
    首先建立一个设备接口IDeviceWriter类

    1 package demoinfo.spring.ioc;
    2 
    3 /**
    4  * 设备接口
    5  */
    6 public interface IDeviceWriter {     
    7     public void saveToDevice();     
    8 }    
    View Code

    再建立2个设备类
    软盘类

     1 package demoinfo.spring.ioc;
     2 
     3 /**
     4  * 软盘类
     5  */
     6 public class FloppyWriter implements IDeviceWriter {     
     7     public void saveToDevice() {     
     8         System.out.println("储存至软盘…");     
     9     }     
    10 } 
    View Code

    USB类

     1 package demoinfo.spring.ioc;
     2 
     3 /**
     4  * USB类
     5  */
     6 public class UsbDiskWriter implements IDeviceWriter {  
     7     public void saveToDevice() {  
     8         System.out.println("储存至移动硬盘…");  
     9     }  
    10 } 
    View Code

    BusinessBean业务类

     1 package demoinfo.spring.ioc;
     2 
     3 /**
     4  * 磁盘业务的业务JavaBean类
     5  */
     6 public class BusinessBean {  
     7     private IDeviceWriter writer;  
     8   
     9     public void setDeviceWriter(IDeviceWriter writer) {  
    10         this.writer = writer;  
    11     }  
    12   
    13     public IDeviceWriter getDeviceWriter() {  
    14         return writer;  
    15     }  
    16   
    17     public void save() {  
    18         if (writer == null) {  
    19             throw new RuntimeException("DeviceWriter needed...");  
    20         }  
    21         writer.saveToDevice();  
    22     }  
    23 } 
    View Code

    配置文件businessFactoryConfig.xml代码如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
     4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     7     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     8     http://www.springframework.org/schema/context   
     9      http://www.springframework.org/schema/context/spring-context-3.0.xsd   
    10      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
    11      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
    12      default-autowire="byName">
    13 
    14     <bean id="floppy" class="demoinfo.spring.ioc.FloppyWriter"/>    
    15     <bean id="usb" class="demoinfo.spring.ioc.UsbDiskWriter"/>    
    16             
    17     <bean id="businessBean"      
    18           class="demoinfo.spring.ioc.BusinessBean">      
    19         <property name="deviceWriter">    
    20             <ref bean="usb"/>    
    21         </property>      
    22     </bean>      
    23 
    24 </beans>
    View Code

    最后测试类代码如下:

     1 package demoinfo.spring.ioc;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 public class SpringDemo {     
     7     public static void main(String[] args) {
     8         //获得Spring中定义的Bean实例(对象)
     9         ApplicationContext context = new ClassPathXmlApplicationContext(     
    10         "classpath:demoinfo/spring/ioc/businessFactoryConfig.xml ");     
    11         BusinessBean business = (BusinessBean) context.getBean("businessBean");     
    12         business.save();
    13     }     
    14 }    
    View Code
  • 相关阅读:
    Linux下date命令,格式化输出,时间设置
    Linux scp复制文件,不需要输入密码的技巧
    Linux中cp和scp命令的使用方法
    Linux定时任务系统 Cron
    Eclipse启动Tomcat后无法访问项目
    eclipse下tomcat插件配置说明
    RPM方式安装MySQL5.6和windows下安装mysql解压版
    shell script练习
    Eclipse Java注释模板设置详解
    mysql备份还原数据库
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/5809445.html
Copyright © 2011-2022 走看看