zoukankan      html  css  js  c++  java
  • 浅析Spring中的IOC和AOP两大核心概念

    一、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类

    <bean id="userService" class="org.leadfar.service.UserService"/>
    <bean id="documentService" class="org.leadfar.service.DocumentService"/>
    <bean id="orgService" class="org.leadfar.service.OrgService"/>
     
    <bean id="userAction" class="org.leadfar.web.UserAction">
         <property name="userService" ref="userService"/>
    </bean>

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

    package org.leadfar.web;
    public class UserAction{
         private UserService userService;
         public String login(){
              userService.valifyUser(xxx);
         }
         public void setUserService(UserService userService){
              this.userService = userService;
         }
    }

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

      Spring依赖注入的实现技术是:动态代理。

    1、IOC思想

      java 程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像 new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而 IOC 的思想是:Spring 容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。

      从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。IOC和DI是代表的含义是类似的。

    2、spring的容器

      在 Spring 容器启动的时候,Spring 会把你在 application.xml 中配置好的 bean 都初始化,在你需要调用的时候,把已经初始化的 bean 分配给你要调用这些 bean 的类,而不用去创建一个对象的实例。

      Ioc 的常见容器是:ApplicationContext 和 BeanFactory

    3、IOC 是基于 java 的反射机制以及工厂模式实现的

    4、了解一下IOC的演进流程

      非常直观的解释就是这一堆东西:

    (1)第一时代:之前全部要一个一个 KnowledgeDAO knowledgeDAO = new KnowledgeDAO();的,

    (2)第二时代:到了 spring 之后呢,就直接写变量注入即可,但是需要写xml文件配置或者用注解

    @Autowired
    private final KnowledgeDAO knowledgeDAO;

    (3)第三时代:到springboot之后,类上加@Service/@Controller等,对象连注解都不用写了,直接 private final KnowledgeDAO knowledgeDAO;

      当然,虽然尽管:会用简单、概念理解简单,但是要自己理解真正原理去实现还是有点困难的。

    二、AOP:即面向切面编程

      面向切面编程的目的就是分离关注点。

      什么是关注点呢?就是你要做的事,就是关注点。

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

      AOP的好处就是你只需要干你的正事,其它事情别人帮你干

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

      从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力

      事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务

    1、分离关注点

      面向切面编程的目的是分离关注点,通俗的说是指使用 aop 你可以一心关注你的正事,而其他的事交给别人处理。

      AOP (面向切面编程) 技术利用一种称为 “横切” 的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

    2、横切关注点

      AOP 把软件系统分为两个部分:核心关注点和横切关注点。

      业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。

      比如提供的事务管理机制,事务管理就是一个关注点,你的正事就是去访问数据库(核心关注点),而你不想管事务(横切关注点),所以,Spring 在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交 / 回滚事务!

    3、aop采用的技术

      一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

      二是采用静态织入的方式,引入特定的语法创建 “方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。这里静态织入的原理就是在编译期间,切面直接以字节码形式编译到目标字节码中。

    参考文章:https://blog.csdn.net/eson_15

  • 相关阅读:
    静态联编和动态联编
    常用Oracle分析函数详解
    Web Service , 不详细的介绍
    Eclipse安装JSEclipse和Spket
    IE中页面不居中,火狐谷歌等正常
    ExtJS3 详解与实践 之 第二章
    IPV6正则
    很漂亮、兼容火狐的Js日期选择,自动填充到输入框
    使用googlecodeprettify高亮显示网页代码
    ExtJS3 详解与实践 之 第三章
  • 原文地址:https://www.cnblogs.com/goloving/p/14838163.html
Copyright © 2011-2022 走看看