说说你对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. 推荐系统(CTR领域)实战入门指南

    CTR经典模型如:FM,FFM,Wide&Deep,建议自己去复现一个完整的通用模型 先从pytorch版本入手(后期考虑tensorflow),从kaggle上找实际的比赛 github 相 ...

  2. NodeService Ensure that Node.js is installed and can be found in one of the PATH directories

    今天发布NodeService到服务器,服务器环境是window server 2012 一直报错: [1] Ensure that Node.js is installed and can be f ...

  3. C# operator 关键字的用法

    operator 只要是运算符都能重载 operator 关键字的主要作用是用来重载运算符的,还可以用于类或结构中类型的自定义转换. 下面看个例子 class Feige { //定义两个全局变量 i ...

  4. jquery 执行a 标签 点击事件 跳转href 路径

    <a href="./export.pdf" id="pdfdown" download="文件名.pdf">下载</a& ...

  5. 刚开始学习Javascript的一些基础小知识,从入门到崩溃,希望对大家有帮助(只适合初学者)

    一.简介 1.JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,js不能操作文件. 重要的开始啦!!!!! 引入javascript: 行间js <d ...

  6. .Net Core Excel导入导出神器Npoi.Mapper

    前言 我们在日常开发中对Excel的操作可能会比较频繁,好多功能都会涉及到Excel的操作.在.Net Core中大家可能使用Npoi比较多,这款软件功能也十分强大,而且接近原始编程.但是直接使用Np ...

  7. 九、TestNG超时测试

    "超时"表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败. 使用属性 timeOut = 参数(1s*1000) package com.lc ...

  8. 用 Roslyn 做个 JIT 的 AOP

    0. 前言 上接:AOP有几种实现方式 接下来说说怎么做AOP的demo,先用csharp 说下动态编织和静态编织,有时间再说点java的对应内容. 第一篇先说Roslyn 怎么做个JIT的AOP d ...

  9. 工具-效率工具-XMIND8破解(99.1.3)

    @ 目录 1.下载 2.修改hosts文件 3.修改配置文件 4.填入序列号 5.破解完成 关于作者 1.下载 1.点击进入官方网站下载 2.下载破解包 网址:点击进入网盘地址 密码:domd 2.修 ...

  10. 【漏洞复现】Struts2-045分析(CVE-2017-5638)

    如果需要大佬写好的脚本,可以直接去github上面搜 struts2 - 045 一个还比较出名的漏洞,因为涉及到利用Gopher协议反弹shell,所以写篇文章来简单学习下这个漏洞. Struts2 ...