`

工厂模式 Ioc AOP

阅读更多

    分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。

  从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:

  AInterface a = new AInterfaceImp();

  AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。

  Ioc英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。

  其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。

  但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。

Ioc模式(Dependency Injection模式)有三种:

第一种类型 从JNDI或ServiceManager等获得被调用者,这里类似ServiceLocator模式。 1. EJB/J2EE
2. Avalon(Apache的一个复杂使用不多的项目)
第二种类型 使用JavaBeans的setter方法 1. Spring Framework,
2. WebWork/XWork
第三种类型 在构造方法中实现依赖 1. PicoContainer,
2. HiveMind

  有过EJB开发经验的人都知道,每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口,在我的教程EJB是什么章节中,我也是从依赖和工厂模式角度来阐述EJB的使用。

  在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。

工厂模式和Ioc

  假设有两个类B 和 C:B作为调用者,C是被调用者,在B代码中存在对C的调用:

public class B{
   private C comp;
  ......
}

  实现comp实例有两种途径:单态工厂模式和Ioc。

工厂模式实现如下:

public class B{
   private C comp;
  private final static MyFactory myFactory = MyFactory.getInstance();

  public B(){
    this.comp = myFactory.createInstanceOfC();

  }
   public void someMethod(){
    this.comp.sayHello();
  }
  ......
}

特点:

  • 每次运行时,MyFactory可根据配置文件XML中定义的C子类实现,通过createInstanceOfC()生成C的具体实例。

使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下,B类如同通常POJO类,如下:

public class B{
   private C comp;
  public B(C comp){
    this.comp = comp;
   }
   public void someMethod(){
    this.comp.sayHello();
   }
  ......
}

假设C接口/类有有一个具体实现CImp类。当客户端调用B时,使用下列代码:

public class client{
   public static void main( String[] args ) {
    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(CImp.class);
    container.registerComponentImplementation(B.class);
    B b = (B) container.getComponentInstance(B.class);
    b.someMethod();
   }
}

  因此,当客户端调用B时,分别使用工厂模式和Ioc有不同的特点和区别:

  主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。

  使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。

  所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。
  这种联系转移实际也是一种分离关注,它的影响巨大,它提供了AOP实现的可能。

Ioc和AOP

  AOP我们已经知道是一种面向切面的编程方式,由于Ioc解放自由了B类,而且可以向B类实现注射C类具体实现,如果把B类想像成运行时的横向动作,无疑注入C类子类就是AOP中的一种Advice,如下图:

  通过下列代码说明如何使用Picocontainer实现AOP,该例程主要实现是记录logger功能,通过Picocontainer可以使用简单一行,使所有的应用类的记录功能激活。

首先编制一个记录接口:

public interface Logging {

  public void enableLogging(Log log);

}

有一个LogSwitcher类,主要用来激活具体应用中的记录功能:

import org.apache.commons.logging.Log;
public class LogSwitcher
{
  protected Log m_log;
  public void enableLogging(Log log) {
    m_log = log;
    m_log.info("Logging Enabled");
  }
}

一般的普通应用JavaBeans都可以继承这个类,假设PicoUserManager是一个用户管理类,代码如下:

public class PicoUserManager extends LogSwitcher
{

  ..... //用户管理功能
}
public class PicoXXXX1Manager extends LogSwitcher
{

  ..... //业务功能
}
public class PicoXXXX2Manager extends LogSwitcher
{

  ..... //业务功能
}

注意LogSwitcher中Log实例是由外界赋予的,也就是说即将被外界注射进入,下面看看使用Picocontainer是如何注射Log的具体实例的。


DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(PicoUserManager.class);
container.registerComponentImplementation(PicoXXXX1Manager.class);
container.registerComponentImplementation(PicoXXXX2Manager.class);
.....

Logging logging = (Logging) container.getComponentMulticaster();

logging.enableLogging(new SimpleLog("pico"));//激活log

  由上代码可见,通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现?

  总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。J道的JdonSD框架也使用了Ioc模式。

分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...

    Spring IOC AOP MVC 简单例子

    在Spring中,IOC通过Bean工厂管理对象的生命周期和依赖关系。当需要一个对象时,不再由代码直接创建,而是由Spring容器负责实例化、装配和管理。这使得代码更加松耦合,易于测试和维护。 2. Spring AOP(面向切面...

    ioc AOP深入了解

    IoC,即控制反转,是一种设计思想,在软件工程领域被广泛应用于解决对象间依赖关系的问题。传统的编程模式中,对象创建自身依赖的对象并调用它们,而在IoC模式下,对象依赖的其他对象是由外部容器提供的。这样做的...

    spring IOC AOP simulation.rar

    在传统的编程模式中,对象通常会自行创建依赖的对象,而在IoC中,对象的创建和初始化由Spring容器负责,对象只需要声明它需要哪些依赖,而不需要知道如何创建它们。这种方式使得代码更加松耦合,易于测试和维护。 *...

    SpringIOC和AOP原理设计模式

    Spring框架的核心特性主要体现在Spring...总的来说,Spring框架的IOC和AOP是强大的工具,它们通过设计模式和创新的编程思想,解决了传统开发中的许多问题,使开发者能更专注于业务逻辑,从而提高了开发效率和软件质量。

    模拟实现spring IOC AOP的例子

    在本文中,我们将深入探讨如何模拟实现Spring框架中的两个核心特性:Inversion of Control(IoC,控制反转)和Aspect-Oriented Programming(AOP,面向切面编程)。这两个概念在现代Java应用开发中占据着重要的地位...

    Java Spring代理模式AOP-IOC分析

    Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...

    Spring常见面试题与答案,IOC AOP等

    答案:BeanFactory 是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的 BeanFactory 实现是 XmlBeanFactory 类。 5. XMLBeanFactory 答案:XmlBeanFactory 是 ...

    aven2+spring(ioc aop)+struts+mybatis

    本项目标题提及的是"aven2+spring(ioc aop)+struts+mybatis",这四者是Java Web开发中的经典组合,被称为SSH2(Struts2、Spring、Hibernate和MyBatis)。尽管这里的"Hibernate"未在描述中出现,但通常与MyBatis一起...

    手写简单实现ioc、aop事务demo

    在这个“手写简单实现ioc、aop事务demo”中,我们将探讨如何通过工厂模式和动态代理来实现这些概念。 首先,让我们了解IOC的核心思想。在传统的编程中,对象创建和管理的控制权在程序员手中,而IOC则是将这种控制权...

    SpringIOC和AOP实现机制模拟

    首先,Spring的控制反转(IOC)是一种设计模式,它将对象的创建和管理权从代码中移出,交由Spring容器负责。这样可以降低组件之间的耦合,提高代码的可测试性和可维护性。在Spring中,IOC主要通过以下几种方式实现:...

    以注解方式模拟Spring_IoC,AOP

    在没有Spring的情况下,我们可以使用简单的工厂模式或反射机制来模拟IoC,用代理模式或动态代理(如Java的`java.lang.reflect.Proxy`)来模拟AOP。这通常涉及到创建一个容器(类似Spring的ApplicationContext),...

    绝对深层次IOC和AOP的理解

    实现IOC的主要设计模式是工厂模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在IOC中,Spring充当了高级工厂的角色,根据配置动态地创建和装配对象。Spring容器会根据配置信息创建Bean,并...

    Spring4Ioc-Aop

    ### Spring4 Ioc-Aop 知识点详解 #### 一、Spring框架简介 Spring是一个开源框架,旨在简化企业级应用开发。通过Spring框架,普通的JavaBean能够实现以往只有通过EJB才能完成的功能。Spring的核心特性包括轻量级、...

    zdy_mySpring_Ioc_Aop.zip

    《深入理解Spring Ioc与Aop》 Spring框架作为Java领域中最广泛应用的轻量级框架之一,其核心特性包括依赖注入(IoC)和面向切面编程(AOP)。这两个概念是Spring框架的灵魂,也是现代企业级应用开发的重要基石。 ...

    简单理解Spring之IOC和AOP及代码示例

    你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b=new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、...

    Java进阶之手写实现IoC和AOP共16页.pdf.zi

    总的来说,手写实现IoC和AOP是对Java高级特性的深入理解和实践,这不仅有助于提升开发者对设计模式的理解,还能锻炼解决问题和抽象思维的能力。通过这种方式,开发者可以更好地掌握如何构建可扩展、低耦合的系统,这...

    spring AOP 引入jar包,spring IOC 引入Jar包

    1. **控制反转(Inversion of Control)**:传统模式下,对象自己管理依赖,而 IOC 把这个责任交给了容器,对象只需要声明自己的依赖,由容器负责注入。 2. **依赖注入(Dependency Injection, DI)**:IOC 的实现...

    拿捏面试官-Spring AOP IOC源码笔记

    - **回顾对象依赖**:传统方式如直接new对象,工厂模式,或配置文件管理依赖。 - **Spring依赖注入**:通过构造函数、setter方法,或自动装配实现。 7. **AOP入门** - **cglib代理**:Spring AOP使用动态代理...

    自己写的类struts的简易的mvc实现+一个类Spring的IOC和简单AOP

    标题中的“自己写的类Struts的简易的MVC实现+一个类Spring的IOC和简单AOP”揭示了这个压缩包包含两个主要部分:一个模仿Struts框架实现的简单MVC框架,以及一个类似Spring框架的轻量级依赖注入(IOC)和面向切面编程...

Global site tag (gtag.js) - Google Analytics