谈谈Spring中的IOC和AOP概念

  IOC和AOP是spring中的两个核心的概念,下面谈谈对这两个概念的理解。

1. IOC(Inverse of Control):控制反转,也可以称为依赖倒置。

        所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。所以,不倒置,意味着A要主动获取B,才能使用B;到了这里,就应该明白了倒置的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。
        形象的举例就是:
        通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?
        解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:
        第一:向小卖部注册为会员。
        第二:告诉小卖部你需要什么。

        这和Spring的做法很类似!Spring就是小卖部,你就是A对象,水就是B对象
        第一:在Spring中声明一个类:A
        第二:告诉Spring,A需要B

        假设A是UserAction类,而B是UserService类

[html] view plain copy

 

  1. <bean id="userService" class="org.leadfar.service.UserService"/>  
  2. <bean id="documentService" class="org.leadfar.service.DocumentService"/>  
  3. <bean id="orgService" class="org.leadfar.service.OrgService"/>  
  4.   
  5. <bean id="userAction" class="org.leadfar.web.UserAction">  
  6.      <property name="userService" ref="userService"/>  
  7. </bean>  

        在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:

[java] view plain copy

 

  1. package org.leadfar.web;  
  2. public class UserAction{  
  3.      private UserService userService;  
  4.      public String login(){  
  5.           userService.valifyUser(xxx);  
  6.      }  
  7.      public void setUserService(UserService userService){  
  8.           this.userService = userService;  
  9.      }  
  10. }  

        在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!),当然咯,我们也可以使用注解来注入。Spring依赖注入的实现技术是:动态代理

2. AOP:即面向切面编程

        面向切面编程的目标就是分离关注点。什么是关注点呢?就是你要做的事,就是关注点。假如你是个公子哥,没啥人生目标,天天就是衣来伸手,饭来张口,整天只知道玩一件事!那么,每天你一睁眼,就光想着吃完饭就去玩(你必须要做的事),但是在玩之前,你还需要穿衣服、穿鞋子、叠好被子、做饭等等等等事情,这些事情就是你的关注点,但是你只想吃饭然后玩,那么怎么办呢?这些事情通通交给别人去干。在你走到饭桌之前,有一个专门的仆人A帮你穿衣服,仆人B帮你穿鞋子,仆人C帮你叠好被子,仆人C帮你做饭,然后你就开始吃饭、去玩(这就是你一天的正事),你干完你的正事之后,回来,然后一系列仆人又开始帮你干这个干那个,然后一天就结束了!

        AOP的好处就是你只需要干你的正事,其它事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也许有一天,出门之前你还想带点钱,那么你再雇一个仆人D专门帮你干取钱的活!这就是AOP。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。

        从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!+

转载:http://blog.csdn.net/eson_15/article/details/51090040

时间: 2024-09-08 10:06:03

谈谈Spring中的IOC和AOP概念的相关文章

Spring中使用AspectJ实现AOP

一,一些基本概念                Spring除了IOC容器之外,另一大核心就是AOP了.Spring 中AOP是通过AspectJ来实现的.                   首先来看下AOP 的相关概念:        1,Aspect                     对横切性关注点的模块化.         2,Advice                      对横切性关注点的具体实现        3,Cross Cutting Concern       

Spring中Aspectj和Schema-based AOP混用引起的错误

         前几天要在项目中增加一个新功能用来监控某些模块的运行情况,自然就想到了使用Spring的AOP来实现.之前已经有类似的AOP代码,使用的是Schema-based形式配置的,也就是在Spring的ApplicationContext.xml中加入了: <bean id="handlerBeanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanName

Spring中bean的scope

Spring容器中的bean具备不同的scope,最开始只有singleton和prototype,但是在2.0之后,又引入了三种类型:request.session和global session,不过这三种类型只能在Web应用中使用. 在定义bean的时候,可以通过指定<bean>的singleton或者scope属性来指定相应对象的scope,例如: <bean id="testMock" class="org.test.javadu.TestMock&

Spring中的AOP(二)——AOP基本概念和Spring对AOP的支持

AOP的基本概念     AOP从运行的角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中的各个步骤,希望以更好的方式来组合业务逻辑的各个步骤.AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点,而不与具体某个类耦合(即在不污染某个类的情况下,处理这个类相关的切点).下面是一些AOP的一些术语:     切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点通常会横切多个对象,因此常被称为横切关注点     连接点(JoinPoi

Java Spring的IoC和AOP的知识点速记

Spring简介 Spring解决的最核心的问题就是把对象之间的依赖关系转为用配置文件来管理,这个是通过Spring的依赖注入机制实现的. Spring Bean装配 1. IOC的概念以及在Spring容器中如何进行IOC的操作. IOC:Inversion of Control,控制反转.在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建.销毁现在转变成由Spring的容器管理. 2. Spring容器

【SSH系列】spring中为什么要使用IOC

开篇前言 在前面的博文中,小编主要简单的介绍了spring的入门知识,随着学习的深入,我们知道spring最核心的两大技术,IOC和AOP,这两个技术也是spring最耀眼的地方,在后续的博文中小编将隆重介绍IOC和AOP,今天这篇博文,小编先简单的介绍一下,IOC是什么?在spring中为什么要使用IOC?IOC的优缺点以及IOC的应用. IOC是什么? 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的

Spring中基于aop命名空间的AOP 一(一点准备工作和一个例子)

在某些时候,我们工程中使用的JDK 不一定就是1.5 以上,也就是说可能不支持Annotation 注解,这时自然也就不能使用@AspectJ 注解驱动的AOP 了,那么如果我们仍然想使用AspectJ 灵活的切入点表达式,那么该如何呢?Spring 为我们提供了基于xml schematic 的aop 命名空间,它的使用方式和@AspectJ 注解类似,不同的是配置信息从注解中转移到了Spring 配置文件中.在这里,我们将详细介绍如何使用Spring 提供的<aop:config/> 标签

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

spring最核心的部分莫过于ioc和aop了,博主菜逼一枚,如果有哪里理解的不对或者代码上有瑕疵的地方欢迎大家指正,大家互相学习,还有就是这只是模仿一下spring思想,只是把事务管理和bean管理简单模仿一下,完全不代表spring,如果想深入理解请看spring源码,下面就开始我们简单的模仿,纯手打,觉得还行就赞一下吧~ 这个项目不是web项目,只是一个简单的java项目,测试用junit,废话不多说了,下面上代码: 项目的目录结构: 说明:图中划红线的部分都是核心部分 红线部分说明: ①

Spring中我们用到的功能实现:基于注解的Ioc自动装配

  我们要完成自动装配,那么就要有一个存放bean对象的容器,然后要有装配的注解,那么哪些类该被存到容器呢,在spring中我们使用过@Service.@Resource等,看下面的代码,你也可以做到.     来看看这是一个简单的容器接口 /**  * 容器接口  * @author:rex  * @create_time:2014-6-26  * @version:V1.0  */ public interface Container { Object getBean(String name