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 了~

对 Spring 的核心(AOP 和 IOC)的理解(大白话)的更多相关文章

  1. 9.秋招复习简单整理之Spring面试AOP和IOC的理解

    1.Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系,但不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用 ...

  2. AOP和IOC个人理解

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

  3. spring基础概念AOP与动态代理理解

    一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  4. 谈谈Spring Ioc的理解

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

  5. AOP与IOC的概念

    AOP与IOC的概念(即spring的核心) a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度.而sp ...

  6. 谈谈对Spring IOC的理解(转)

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

  7. 谈谈对Spring IOC的理解

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

  8. Spring系列之谈谈对Spring IOC的理解

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

  9. 谈谈对Spring IOC的理解【转】

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

  10. Spring IOC的理解

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

随机推荐

  1. Css的优先权问题

    看这篇文章之前,对这个问题一直没深入研究,导致有时候遇到一些问题会很麻烦,看到这篇文章让我茅塞顿开,转帖回来保存一下以便今后复习. 发现很多朋友对 CSS 的优先权不甚了解,规则很简单.需要说明的一点 ...

  2. UnicodeDammit

    UnicodeDammit 是BS内置库, 主要用来猜测文档编码. 编码自动检测 功能可以在Beautiful Soup以外使用,检测某段未知编码时,可以使用这个方法: from bs4 import ...

  3. BZOJ4897: [Thu Summer Camp2016]成绩单【DP of DP】

    Description 期末考试结束了,班主任L老师要将成绩单分发到每位同学手中.L老师共有n份成绩单,按照编号从1到n的顺序叠 放在桌子上,其中编号为i的成绩单分数为w_i.成绩单是按照批次发放的. ...

  4. Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡   分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑 ...

  5. hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)

    题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j) ...

  6. js代码中碰到的函数

    第一个--->字符串的截取substring()方法 substring(a,b)--->[a,b)区间截取字符.下标从0开始.从a下标开始,截取到b下标的前一个字符.返回一个新的字符串 ...

  7. 如何快速配好java环境变量和查看电脑上安装JDK的版本位数

    今天一个新手在群里问自己的Eclipse打不开,然后我是属于那种热心肠的人,一般自己知道的就会告诉他们,看了下,是环境变量没有配好,反正我觉得配环境比较简单,现在就教大家简单的环境变量配法 path ...

  8. leetcode:Palindrome Number【Python版】

    一次AC 题目要求中有空间限制,因此没有采用字符串由量变向中间逐个对比的方法,而是采用计算翻转之后的数字与x是否相等的方法: class Solution: # @return a boolean d ...

  9. k8s helm 可视化UI 管理工具 monocular部署试用

    官方建议是用 helm 进行安装,但是helm 有点费事(各种原因...) 所以使用官方说的使用docker-compose 但是默认官方的compose 跑起来 还是真费事,经过调整,修改了一版支持 ...

  10. tomcat源码阅读之过滤器

    一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...