spring-IOC、AOP及项目经验分享

  1. spring-IOC、AOP及项目经验分享

IoC: Inversion of Control (控制反转/反转控制),它是一个技术思想而不是一个技术实现,在Java开发领域他所描述的事情是对象的创建和管理的问题。 与传统开发方式相比在IOC的思想开发方式下,当类A需要以来类B时,我们不要自己去new对象了,而是由IOC容器帮我们实例化对象并且去管理它,我们需要什么对象直接从IOC容器中获取即可,由此我们可以省去创建和管理对象的一系列事情,也丧失了创建、管理对象的权力。 控制反转解释: 控制:指的是对象创建(实例化、管理)的权利 反转:控制权交给外部环境了(spring框架、IoC容器

 

IOC解决了什么问题 IoC解决对象之间的耦合问题,例如当service层调用dao层时,传统方式下我们需要在service中new出dao层的具体实现类,这时当我们实现类需要改变时,service层也需要做相应的改变,这就造成了service层和dao层的强耦合。而使用IOC实例化对像时,我们只需要关注调用的dao层的接口,在service中声明接口属性,具体的实现类在IOC容器中进行切换,因此也不会产生对象中强耦合的情况。 示例图如下:

 

一、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采用的技术

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

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

参考:浅析Spring中的IOC和AOP两大核心概念 - 古兰精 - 博客园

参考:Spring 的 IOC 和 AOP 简述_小诺。的博客-CSDN博客_spring的ioc和aop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值