说说你对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. flask实现分类搜索的小测试

    最新学长要求实现一个搜索的功能呢,也费了一点功夫.这个案例也没有学长写的好,比学长的实现差了不少,待我仔细研究习再发出相应代码 项目要求,搜索语法如下: titile: xxx #搜索titile的所 ...

  2. Day7 Scrum 冲刺博客

    一.站立式会议1. 会议照片 2. 工作进度+燃尽图 团队成员 昨日完成工作 今日工作计划 遇到的困难  周梓波  添加键盘监听事件 由于游戏中计分规则不合理,进行重新设计  无  纪昂学  添加方块 ...

  3. 笨方法学python笔记

    编程是什么 编程就是通过输出一种语言给计算机"听",命令其去执行相应的操作. 我们称我们给计算机下达的命令称为指令.一般说程序就是有多个指令构成的. 计算机需要使用非常多的电路来实 ...

  4. solidity 合约单元测试报错 org.fisco.bcos.web3j.protocol.exceptions.TransactionException: Transaction has failed with status: 0x16. Gas used: 1163650. (not-enough gas?)

    org.fisco.bcos.web3j.protocol.exceptions.TransactionException: Transaction has failed with status: 0 ...

  5. rhel6.4搭建rac前共享存储配置(iscsi+multipath+udev)

    rhel6.4搭建rac前共享存储配置(iscsi+multipath+udev) server: IP配置: 192.168.12.30 192.168.12.40   添加一个100G磁盘/dev ...

  6. Java读取系统默认时区

    工作中,遇到一个Java读取默认时区的问题,后来看了openjdk的源码,大致整理一下过程 public class Test { public void test(){ TimeZone.getDe ...

  7. DSL查询基础—关键字

    1.query查询语句 { "query" : { "match" : { "last_name" : "Smith" ...

  8. mini-web框架-元类-总结(5.4.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 python中万物都是对象 使用python中自带的globals函数返回一个字典 通过这个可以调取当前py文件中的所有东西 当定义一个函数,类,全局 ...

  9. Spring中BeanFactory与FactoryBean到底有什么区别?

    一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...

  10. Python3和高性能全文检索引擎Redisearch进行交互

    安装 pip install redisearch 使用 from redisearch import Client, TextField # 创建一个客户端与给定索引名称 client = Clie ...