说说你对spring的理解?

Spring框架是一个轻量级的企业级开发的一站式解决方案,所谓一站式解决方案就是可以基于Spring解决Java EE开发的所有问题。Spring框架主要提供了IoC容器、AOP、数据访问、Web开发、消息、测试等相关技术的支持。

使用Spring框架有什么好处呢?

框架能更让我们高效的编程以及更方便的维护我们的系统。

(1)轻量级:相对其他框架来说,Spring的大小和开销是轻量的。

(2)控制反转(IoC):Spring通过控制反转实现了松散耦合。

(3)面向切面编程(AOP):将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证,日志,事务处理。

(4)Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。

(5)Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。

解释下DI,IoC,AOP

Spring的核心是控制反转(IoC)和面向切面(AOP)。

 DI(Dependency Injection,依赖注入)

指的是容器负责创建对象和维护对象间的依赖关系,而不是由对象本身负责自己的创建和解决自己的依赖。

 IoC (Inversion of Control,控制反转)

不是一个具体的技术,而是一种设计思想。传统的Java开发模式中,当需要创建一个对象时,我们会使用NEW或者getInstance等方法直接或者间接调用构造方法去创建一个对象。而在Spring中,通过容器负责创建对象和维护对象间的依赖关系,而不是由对象主动去找。

补充理解:

(1) 在Spring环境下依赖注入和控制反转是等同的概念(是同一个概念从不同角度的描述的),控制反转是通过依赖注入实现的。由于控制反转这个概念比较含糊(可能只理解成了容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年被开发者尊称为“教父”的MartinFowler(世界顶级专家,敏捷开发方法的创始人之一)又给出了一个新的名字“依赖注入”,相对IoC而言,“依赖注入”明确描述了“被注入对象依赖 IoC 容器配置依赖对象”。

(2) 比如说传统找对象,先要设定好你的要求,如身高、体重、长相等,然后再一个一个的主动去找符合要求的对象,而IoC相当于,你把这些要求直接告诉婚介中心,由他们直接给你匹配到符合要求的对象,理想情况下是直接会帮你找到合适的对象,这就是传统编程模式和 IoC 的区别。

 AOP (Aspect Oriented Programming,面向切面编程)

作为面向对象的一种补充,用于解剖封装好的对象内部,找出其中对多个对象产生影响的公共行为,将其封装为一个可重用的模块,这个模块叫做”切面(Aspect)”,切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证,日志,事务处理。

Spring AOP 目前提供了三种配置方式:

(1)基于 Java API 的方式;

(2)基于 @AspectJ(Java)注解的方式;

(3)基于 XML <aop /> 标签的方式。

Spring IoC的优点?

(1)    使用更方便,拿来即用,无需显式的创建和销毁的过程;

(2)    更符合面向对象的设计法则;

(3)    提供了 AOP 抽象,利用它很容易实现权限拦截、运行期监控等功能;

(4)    可以很容易提供众多服务,比如事务管理、消息服务等;

(5)    提供了单例模式的支持;

(6)    低侵入式设计,代码的污染极低,降低了业务对象替换的复杂性。

Spring IoC 注入方式?

IoC 的注入方式有三种:构造方法注入、Setter 注入和接口注入。

(1)   构造方法注入

构造方法注入主要是依赖于构造方法去实现,构造方法可以是有参的也可以是无参的,我们平时new对象时就是通过类的构造方法来创建类对象的,每个类对象默认会有一个无参的构造方法, Spring 通过构造方法注入的代码示例如下:

public class Person {
public Person() {
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
private int id;
private String name;
// 忽略 Setter、Getter 的方法
}

applicationContext.xml 配置如下:

<bean id="person" class="org.springframework.beans.Person">
  <constructor-arg value="1" type="int"></constructor-arg>
  <constructor-arg value="Java" type="java.lang.String"></constructor-arg>
</bean>

(2)  Setter注入

Setter方法注入的方式是目前Spring主流的注入方式,它可以利用JavaBean规范所定义的Setter/Getter方法来完成注入,可读性和灵活性都很高,它不需要使用声明式构造方法,而是使用 Setter 注入直接设置相关的值,实现示例如下:

<bean id="person" class="org.springframework.beans.Person">
<property name="id" value="1"/>
   <property name="name" value="Java"/>
</bean>

(3)   接口注入

接口注入方式是比较古老的注入方式,因为它需要被依赖的对象实现不必要的接口,带有侵入性,因此现在已经被完全舍弃了,所以本文也不打算做过多的描述,大家只要知道有这回事就行了。

IOC的原理?(IOC容器是怎么工作的?)

几个概念

Bean:在 Spring 中,构成应用程序主干并由Spring IOC容器(ApplicationContext)实例化、组装(assembled)和管理的对象称为bean。

BeanDefinition:是Spring中关于bean的元数据的定义和描述。

元数据:即描述数据的数据。元数据本身不具备任何可执行能力,只能通过外界代码来对这些元数据行解析后进行一些有意义操作。

配置元数据:无论是通过xml配置、注解配置还是Java配置的方式(来注册Bean),都被称为配置元数据,Spring IOC容器解析这些配置元数据进行Bean初始化、配置和管理依赖。

工作原理

(1)准备配置文件:配置文件中声明Bean定义也就是为Bean配置元数据。

(2)Spring IOC容器解析配置元数据进行Bean初始化、配置和管理依赖:Spring IOC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,Spring IOC容器根据BeanDefinition进行Bean初始化、配置和组装。

(3)实例化IOC容器:由客户端实例化容器,获取需要的Bean。

@Test
public void testHelloWorld() {
//1、读取配置文件实例化一个IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
//2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloApi helloApi = context.getBean("hello", HelloApi.class);
//3、执行业务逻辑
helloApi.sayHello(); }

解释一下AOP中的名词

1) Aspect :将对多个对象产生影响的公共行为封装为一个可重用的模块,这个模块叫做”切面(Aspect)”,比如日志管理就是一个切面;

2) Join point :连接点,指方法,类里面哪些方法可以被增强,这些方法被称为连接点,在spring的AOP中,指的是所有现有的方法;

3) Advice :通知,在切面的某个特定的连接点(Join point)上执行的操作。

通知分为:

前置通知:在原来方法之前执行。

后置通知:在原来的方法之后执行。特点:可以得到被增强方法的返回值。

环绕通知:在方法之前和方法之后执行。

异常通知:目标方法出现异常执行,如果方法没有异常,不会执行。特点:可以获得异常的信息。

最终通知:指的是无论是否有异常,总是被执行。

4) Pointcut :切入点是指我们要对哪些连接点(Join point)进行拦截。分为注解式拦截(拦截带有某个注解的方法)和方法规则拦截(拦截指定的方法)。

spring aop的原理吗?

spring aop就是基于代理模式中的动态代理实现的,其中动态代理的实现方式有JDK Proxy和CGLib(Code Generation Library)两种,Spring框架中同时使用了两种动态代理JDKProxy和CGLib,源码中有个创建AOP代理类的方法createAopProxy()中,会判断目标类是否为接口,如果是接口的话,Spring 就会使用 JDK Proxy,去创建代理对象,其他情况就会使用CGLIB动态代理(Code Generation Library 代码生成库),生成一个被代理对象的子类作为代理。

我们在调用getBean()方法的时候返回的其实是代理类的实例,而这个代理类在Spring中使用的是JDKProxy或CgLib实现的,它的核心代码在 DefaultAopProxyFactory#createAopProxy(...) 中,源码如下:

常见面试题?

(1) 说说你对spring的理解?

(2) 使用Spring框架有什么好处呢?

(3) 使用Spring框架有什么好处呢?

(4) 谈一谈你对 IoC 和 DI 的理解。

(5) Spring IoC 有哪些优势?

(6) IoC 的注入方式有哪些?

(7) 谈一谈你对 AOP 的理解。

参考/好文

(1) 书籍 -- SpringBoot实战 -- 汪云飞 编著

(2) 聊一聊Spring中的线程安全性 --

https://juejin.im/post/5a0045ef5188254de169968e

(3)《今天面试了吗》 - Spring

https://juejin.im/post/5e6d993cf265da575b1bd4af

(4) 拉钩课程 -- Java源码剖析

https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59

Spring(1) --入门(IoC,AOP)的更多相关文章

  1. Spring框架入门之AOP

    Spring框架入门之AOP 一.Spring AOP简单介绍 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented ...

  2. spring之初识Ioc&Aop

    Spring框架的作用 spring是一个轻量级的企业级框架,提供了ioc容器.Aop实现.dao/orm支持.web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯. Spr ...

  3. spring的长处 ioc aop

    spring 的长处? 1.减少了组件之间的耦合性 ,实现了软件各层之间的解耦 2.能够使用easy提供的众多服务.如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它非 ...

  4. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  5. Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

    Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...

  6. 详谈 Spring 中的 IOC 和 AOP

    这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...

  7. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  8. spring ioc aop 原理

    spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...

  9. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

随机推荐

  1. 学习JUC源码(2)——自定义同步组件

    前言 在之前的博文(学习JUC源码(1)--AQS同步队列(源码分析结合图文理解))中,已经介绍了AQS同步队列的相关原理与概念,这里为了再加深理解ReentranLock等源码,模仿构造同步组件的基 ...

  2. Scrum 冲刺 第六篇

    Scrum 冲刺 第六篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成登录注册接口 钟俊豪 完成部分博客圈模 ...

  3. BJOI2015 隐身术

    落谷. Description 给你两个串 \(A.B\).询问 \(B\) 中有多少个非空子串和 \(A\) 的编辑距离不超过 \(K\). Solution 发现 \(K \le 5\),考虑可以 ...

  4. rman恢复实践

    1) Loss of system DATAFILE 2) Loss of non-system DATAFILE 3) Loss of a DATAFILE without Backup 4) Lo ...

  5. Kubernetes【K8S】(五):Service

    Service概念 Kubernetes Service定义了一个Pod的逻辑分组,一种可以访问它们的策略.这组Pod能被Service访问到,通常是通过label Selector. Service ...

  6. MySQL全面瓦解14:事务

    关于事务 我们在数据库中需要执行一个系列的操作的时候,要保证这个系列执行的连续性和完整性,要么整个系列的执行都成功,要么就全部失败(只要有一个步骤失败,其他均回滚到之前的状态), 保证不会存在一部分成 ...

  7. js下 Day04、DOM操作--自定义属性

    语法: 元素.getAttribute('自定义属性名') 功能:获取自定义属性 语法: 元素.setAttribute('自定义属性名','值') 功能:设置自定义属性 语法: 元素.removeA ...

  8. P2240 【深基12.例1】部分背包问题

    P2240 [深基12.例1]部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞.藏宝洞里面有 N(N \le 100)N(N≤100) 堆金币,第 ii 堆金币的总重量和总价值分别是 m_i,v ...

  9. 高可用K8S构建3master+3node+keepalived+haproxy

    视频地址:https://www.bilibili.com/video/BV1w4411y7Go?p=66 所需安装包在视频评论区 安装准备 系统: CentOS-7-x86_64-Minimal-1 ...

  10. django获取choices的显示值

    1,models.py #订单表 class Orders(models.Model): status_cat = ( ('0', '待装货'), ('1', '正在运输'), ('2', '已到达目 ...