Spring

  首先它是一个开源而轻量级的框架。其核心容器的主要组件是Bean工厂(BeanFactory)。Bean工厂使用控制反转(IOC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。

  正如其字面意思,是程序员的春天,大大地降低了体力劳动~

  Spring 常用注解

  1、@Component : 组件。标识这是个受 spring 管理的组件。(当组件不好归类时使用)

  2、@Controller:用于标注控制层组件(如 struts 中的 action)。

      使用这个注解,且不指定 value 的时候,默认 bean 的名字为类名首字母小写。

  3、@Service:用于标注业务层组件。

  4、@Repository:用于标注数据访问组件,即DAO组件。

  5、@Scope("prototype") :将Action的范围设置为原型(也就是多例的)。保证每一个请求有一个单独的 Action 来处理,避免 struts 中 Action 的线程问题。

      由于 spring 默认是单例的,这种情况下,只会创建一个 Action 对象,每次访问都是同一个对象,数据不安全。Struts 要求必须是多例的,每次访问对应的不同的 Action 对象。这个注解相当于在 spring 中保证了这一点。

      有问题啊:为什么 spring mvc 又是建议单例的呢?它不担心数据安全吗?  -- 个人理解:我们表现层使用 struts 时建议是多例的原因是,Struts 是通过模型驱动和属性驱动来获取前端页面参数的,Action 里面存在大量成员变量,单例模式会导致属性重复使用,数据不安全。而 spring mvc 获取参数的模式是通过方法形参,一般之作用于方法,故不需要开启多例。

  6、@Autowired:默认按类型进行自动装配。在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

  7、@Resource:默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

AOP

    -- Aspect-Oriented Programming 面向切面编程

  前言:我们都知道 Java 是 OOP-面向对象编程的,它有自己的优势,也有自己的不足。比如说:在我们开发中,都会有一条业务主线(即客户的需求)。而我们要做的就是实现这个主线上的需求。我们在实现这些功能的时候,经常要干一些额外的不可避免的事情,比如事务的管理,日志的记录等,就很繁杂且代码量增多。

  所以 Spring 提供了另一种角度来思考程序结构,也就是把这一些事情剥离出来,然后适时适地的把它们加入到我们的代码中,比如说 声明式事务管理的时候,我们在 service 层检测到save*、update*这些方法要被调用的时候,我们先进行开启事务什么的,这就是AOP,面向编程的思想。

  总的来说,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

  AOP 名词的大白话解说

  1、通知  --  Advice

    就是要给目标类织入的事情。就是我们说的额外的一些共同的事情,也就是上面说的 事务,日志等。你给先定义好,然后在想用的地方用一下。

  2、连接点  -- JoinPoint

    就是 spring 允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring 的话只支持方法连接点。和方法有关的前前后后(抛出异常),都是连接点。一个类的所有方法前、后、抛出异常时等都是连接点。

  3、切入点  -- Pointcut

    上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,下面再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。(比如需要开启事务的只是“ save * ”、“ update * ”..等等这些方法)。切入点就是定义了哪个类里面的哪些方法的会得到通知

  4、切面  -- Aspect

    切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

  5、织入  -- weaving

    把切面应用到目标对象来创建新的代理对象的过程。可以在编译时、类加载时、运行时完成的织入,spring 采用的是 在运行时完成织入

  6、引入  -- introduction

    允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗~

  7、目标  -- target

    引入中所提到的目标类,也就是要被通知的对象也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。

  8、AOP 的代理  -- AOP Proxy

    目标对象被织入增强后产生的结果类。我的理解它是 spring 为了骗过 jvm 的类型检查,搞出来的一个伪装类。

    spring 伪装采用了两种方式:

    ① 实现和目标类相同的接口  -- 与目标类为双胞胎兄弟(要找我哥办事,弟弟我冒充哥哥收点礼物,再让我哥给你办事~)

    ② 生成子类调用  -- 给目标类当儿子(学会了爸爸的本事,都找我办就好了,但是我要先收点礼物~)

IOC

    -- Inversion of Control 控制反转

  创建对象的控制权,被反转到了 spring 框架。意味着将你设计好的对象交给 spring 控制管理,而不是传统的在你的对象内部直接控制。

  DI  -- Dependency Injection  依赖注入

    由 IOC 容器动态的将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件( spring 中的组件如:controller, service..等)之中。

    大白话:也就是 IOC 会把你当前对象所需要的外部资源动态的注入给你。

  IOC 和 DI   -- “被注入对象依赖IOC容器配置依赖对象”。

    大白话:首先控制反转,我们把对象的控制权交给了 spring 框架的 IOC 容器,所以我们要使用的话,就是依赖 IOC 容器给我们动态注入。

  大白话解说IOC(控制反转)和DI(依赖注入):

  举个栗子!在 UserAction 中要用到 UserServiceImpl 中的方法,最初的方法是在 UserAction 中通过  UserService userService = new UserServiceImpl; 需要它的时候就 new 出来,控制权在自己手里,但是使用 Spring 后,UserAction 不用主动去创建 UserServiceImpl 的实例了,这个工作已经交给 Spring来做了。然后 你要用的时候再直接问 Spring 要,就可以拿来用了。

  这个时候你就由原来的主动创建,变成了被动依赖 Spring 创建好之后给你的注入,才能使用。控制权已经反转给 Spring 了~

转载于:https://www.cnblogs.com/sun7897/p/8807089.html

对 Spring 的核心(AOP 和 IOC)的理解(大白话)相关推荐

  1. Spring核心之对 IOC的理解

    Spring核心之对 IOC的理解 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 一 .IOC IOC : Inversion of Control,中文译为" ...

  2. Spring简述以及AOP、IOC

    Spring 是SSH里面的一种Spring + Struts +Hibernate,如今MVC模式下的一种框架. 应对需求快速变化,主要原因有一种面向切面编程(AOP)的优势. 系统中用到的对象不在 ...

  3. Spring基本用法1——Spring的核心机制:IOC、DI

            前言:一直想写一个关于Spring的系列文章,但是构思许久却不知道以什么方式阐述,毕竟要把一个复杂框架说清楚并不是那么容易的,我也只能尽力而为了.Spring系列文章打算以这样的顺序展 ...

  4. AOP和IOC个人理解

    14:18 2014/5/5 IOC inversion of control 控制反转  将new对象的权力由调用者转移到spring容器(即xml文件),Struts2与Spring整合(scop ...

  5. 对Spring IOC的理解

    1.2.IoC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间 ...

  6. 谈谈Spring Ioc的理解

    原文:http://blog.csdn.net/qq_22654611/article/details/52606960 学了几天Ioc了,但是对它的理解还是模模糊糊,看了这篇博客感觉对Ioc有了更深 ...

  7. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

  8. 透析Spring(一): Spring之IoC容器理解

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

  9. 谈谈对Spring IOC的理解

    2019独角兽企业重金招聘Python工程师标准>>> 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人 ...

  10. 谈谈我对Spring IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

最新文章

  1. 随心测试_软测基础_005 测试人员工作内容
  2. 基于GTID模式MySQL主从复制
  3. 谈谈Tomcat连接器
  4. dropdown.js
  5. 解析JVM内存区域组成
  6. oracle ora 00283,【案例】Oracle报错ORA-16433非归档丢失redo无法启动的恢复过程
  7. react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
  8. 菲波那契数(信息学奥赛一本通-T1071)
  9. java组合与继承始示例_排列组合:用公式示例解释的差异
  10. FPGA相关术语(一)
  11. android 代码植入,Android Studio之Debug运行期代码植入的方法
  12. 常用的Regex验证方法
  13. 优秀的弹窗插件 jquery.lightbox_me.js
  14. 如何在Windows上安装多个MySQL
  15. git fatal: destination path ‘**‘ already exists and is not an empty directory.解决
  16. 常用计算机信息检索策略,信息检索的策略和方法
  17. mysql dump 1449_mysqldump1449错误解决办法
  18. 十六进制与ascii码的互转(c语言),十六进制与ASCII码转换
  19. linux startx无效_startx启动图形界面失败的几个解决方法
  20. vue |实现点击图片预览浏览器满屏大图

热门文章

  1. Win系统 - 浅谈笔记本散热系统
  2. Java实现 蓝桥杯VIP 算法提高 洗牌
  3. 采集到博客数据的10个经典方法
  4. 《华为的冬天》-任正非(2000年)
  5. 百度医疗广告卷土重来_意见3d电视值得卷土重来的时间
  6. Java中的Hash值到底是怎么计算的
  7. 全面剖析亚马逊,让你开店不迷茫!
  8. 高校选课系统设计(一)
  9. CSS中如何使用高斯模糊
  10. JS小数运算的正确姿势:保留两位小数技巧全解析