Spring IOC(DI)和AOP例子

软件152 蒲双

一、IOC概念

   IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建,IOC主要控制了外部资源获取(不只是对象包括比如文件等)。

  DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

  IOC和DI其实是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。

二、AOP概念

  AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

三、例子

 1。创建和管理程序组件对象
   --引入Spring IOC开发包(commons-logging.jar、spring.jar)
   --在src下添加Spring配置文件applicationContext.xml
   --将Bean组件定义到Spring配置文件applicationContext.xml中
    <bean id="标识符" class="包名.类名"></bean>
   --(编码)实例化Spring容器对象利用getBean获取Bean对象实例
      // 实例化Spring容器对象
    String conf = "/applicationContext.xml";
    ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
    // 从容器中获取Bean

    类名 对象名 = (类名) ac.getBean("标识符");

示例:

 

[java] view plain
 
public class JdbcCostDao implements CostDao {  
  
    public JdbcCostDao() {  
        System.out.println("JdbcCostDao构造");  
    }  
  
    public void init() {  
        System.out.println("初始化JdbcCostDao");  
    }  
  
    @Override  
    public void save() {  
        System.out.println("采用jdbc保存对象");  
    }  
  
    @Override  
    public void delete() {  
        String s = null;  
        s.length();// 模拟异常  
        System.out.println("采用jdbc删除对象");  
    }  
  
    public void destory() {  
        System.out.println("释放资源");  
    }  
}  

 

[html] view plain
 
<bean id="jdbcCostDao" scope="singleton" init-method="init"  
     destroy-method="destory" class="com.test.dao.JdbcCostDao"></bean>  

  

[java] view plain 
 
// 测试回收  
@Test  
public void test2() {  
    // 实例化Spring容器对象  
    String conf = "/applicationContext.xml";  
    AbstractApplicationContext ac = new ClassPathXmlApplicationContext(conf);  
  
    // 从容器中获取Bean  
    CostDao costDao = (CostDao) ac.getBean("jdbcCostDao");  
    costDao.save();  
  
    ac.close();// 释放容器对象-->触发释放Bean对象-->触发destory-method方法  
}  

  

运行结果:

[plain] view plain 
 

    a.控制Bean对象创建模式
       在使用时,可以在<bean>定义部分利用scope属性指定bean对象采用单例模式创建还是原型模式创建。
    scope="singleton"表示单例模式(默认值)
    scope="prototype"表示原型模式,每次调用getBean都返回一个新的Bean对象。
    如果应用Web程序中,通过配置可以扩展出request,session等属性值
   b.控制Bean对象创建时机
    scope="singleton"时,Bean对象是在容器实例化时创建。在<bean>中使用lazy-init="true"可以将Bean创建推迟到getBean方法。
     scope="prototype"时,Bean对象是在getBean方法时创建。
   c.追加初始化和销毁方法
      在<bean>中利用init-method指定一个初始化方法。可以在对象创建之后自动调用。
      <bean init-method="myinit">创建Bean对象后,会自动执行myinit方法。
    同理,可以通过destroy-method属性指定方法名。当对象被垃圾回收前自动调用该方法执行资源释放工作。该属性仅适用于singleton模式的Bean对象,当执行Spring容器close()时,容器会释放Bean单例对象,会触发destroy-method="mydestroy"中的mydesctory方法。

posted @ 2017-07-02 20:24  别人的伴i  阅读(501)  评论(0编辑  收藏  举报