对 Spring 的核心(AOP 和 IOC)的理解(大白话)
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)的理解(大白话)的更多相关文章
- 9.秋招复习简单整理之Spring面试AOP和IOC的理解
1.Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系,但不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用 ...
- AOP和IOC个人理解
14:18 2014/5/5 IOC inversion of control 控制反转 将new对象的权力由调用者转移到spring容器(即xml文件),Struts2与Spring整合(scop ...
- spring基础概念AOP与动态代理理解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- 谈谈Spring Ioc的理解
原文:http://blog.csdn.net/qq_22654611/article/details/52606960 学了几天Ioc了,但是对它的理解还是模模糊糊,看了这篇博客感觉对Ioc有了更深 ...
- AOP与IOC的概念
AOP与IOC的概念(即spring的核心) a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度.而sp ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- Spring系列之谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解【转】
学习过Spring框架的人 一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大 ...
- Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理 ...
随机推荐
- Ubuntu install TensorFlow
/******************************************************************************** * Ubuntu install T ...
- 高并发中nginx较优的配置
一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项: 1.nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数. wor ...
- L3-021 神坛 (30 分)
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- SolrCloud6.3 单机、集群、内置jetty、tomcat搭建、对collection操作
参考:https://my.oschina.net/u/1416405/blog/821187 1.Solr 单机 1.1.Solr下载 1.solr官网:http://lucene.apache.o ...
- day35 python学习GIL解释器锁
二 GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全. 可以肯定的一点是:保护不同 ...
- day31 python学习 操作系统的介绍,
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- Ribbon Status Bar
https://documentation.devexpress.com/#WindowsForms/CustomDocument2498 官方文档说明 A Ribbon Status Bar (Ri ...
- HTML/CSS/Javascript代码在线压缩、格式化(美化)工具
CSS 格式化 ProCSSor - http://procssor.com/ CSS 压缩 CSS Compressor - http://www.cssdrive.com/index.php/ ...
- Oracle根据表的大小排序SQL语句
--按照数据行数排序select table_name,blocks,num_rows from dba_tables where owner not like '%SYS%' and table_n ...
- POJ1050最大子矩阵面积
题目:http://poj.org/problem?id=1050 自己用了n^4的像暴搜一样的方法,感到有点奇怪——真的是这样? #include<iostream> #include& ...