写在前面:继续看看spring的面试题,打开ThinkWon大神的总结,不禁吸了两口真气,由于是初学者,很多知识点没有学到,这边只记录学到的,并且能理解的,部分加入自己的想法,一些不能理解的问题应该深入学习后再来补充。 spring是一个 IOC和AOP模块。通过IOC容器管理POJO或JavaBean对象,以及它们之间的耦合关系;通过AOP以动态非入侵的方式增强服务。 优点 Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护(DI),交给Spring管理。 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控和增强等功能。 只需要通过配置就可以完成对事务的管理,而无需手动编程。 Spring对Junit4支持,可以通过注解方便的测试Spring程序。 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。 Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。 缺点 Spring 总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被分别整合在核心容器(Core Container) 、 AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、数据访问与集成(Data Access/Integeration) 、 Web、 消息(Messaging) 、 Test等 6 个模块中。 以下是 Spring 5 的模块结构图 应用上下文模块是spring框架的基本模块,BeanFactory是任何以spring为基础的应用的核心,spring框架建立在context这个模块上,使得spring成为一个容器。 所谓控制反转主要是把传统上的程序直接向内存中申请空间创建对象的这个控制权转移到了外部工厂,通过工厂来对这些创建好的对象进行装配和管理。外部工厂即我们常说的IOC容器,spring IOC负责创建对象,管理对象(依赖注入,装配对象Autowride)并管理这些对象的整个生命周期。 BeanFactory 和 ApplicationContext都是spring的两个核心的接口,都可以当作容器来使用,其中BeanFactory是ApplicationContext父接口。它们之间的区别由: 依赖关系的维护又称为依赖注入,这种关系交给spring来管理,当我们在类中要用到其它的类对象,都由spring来提供,我们只需要在配置文件中说明即可,依赖注入也是IOC控制反转的一种实现。 依赖注入之所以流行,是因为它是一种很可取的方式:让r容器全权负责依赖的查询,需要注入的bean对象只需要暴露出JavaBean的setter方法或者带参数的构造函数,使得容器在初始化时组装对象依赖关系。与其依赖查找方式相比,主要的优势有: 依赖注入是时下最流行的IOC控制反转的一种实现,实现方式有接口注入,构造器注入,setter方法注入。其中由于接口注入的灵活性太差,于是与spring4被废弃。 spring Bean是收到spring管理的bean对象,具体来说是被spring容器初始化,配置和管理的对象。spring Bean是再spring配置文件中定义的,现在也可以通过注解来定义,在spring容器初始化,注入到spring应用程序中。 一个spring Bean的定义包含容器所必知道的配置元数据,包括如何创建一个bean,它的生命周期和它的依赖。 有三种配置方式 前面两个比较常用。 如果是基于XML配置可以在bean标签内配置scope spring的bean的作用范围有5个: 注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。 不是线程安全的。 多线程并发问题的根本在于相同的变量访问冲突问题。 概括来说: 使用@Autowired自动装配指定bean之前,需要在spring配置文件中进行以下配置。 当启动spring的IOC容器后,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired,@Resources,@Inject时,就会在IOC容器中查询需要的bean,并装配给该对象的属性。在使用@Autowired会在容器中寻找对应类型的bean: 可以的。 spring注解配置可以替换XML的配置,可以大大减少XML配置的代码量。 注解装配默认情况下是不开启的,如若开启,spring的XML文件中配置: @Component:在类上加载此注解,可以将Java类标记bean,由spring来管理它。spring的组件扫描机制可以可以将其拾取并注入到应用程序环境中(IOC容器)。 @Required是为了保证对应的属性必须设置,@Required注释用于bean属性的setter方法,被它修饰的setter方法对应的属性必须在XML文件中注入,否则会抛出BeanInitializationException 示例:https://www.cnblogs.com/Guhongying/p/10598732.html @Autowired是默认按照类型注入的,默认情况下它要求依赖必须存在,当然可以设置属性required为false,它的用法和required类似,可以作用域,属性,方法构造器或具有任意名称或任意参数的方法。 @Autowired:是默认按照类型注入的,默认情况下它要求依赖必须存在,当然可以设置属性required为false。 用于指定bean名称的注解,和@Autowired配合使用,避免@Autowired因为找不到类型匹配的bean而抛出异常;或者找到多个bean用名称来消除歧义匹配唯一bean。 @RequestMapping用于接收HTTP请求,并将请求发送到相应的控制器类/方法上。作用位置有: JdbcTemplate是一个封装了JDBC规范的工具类,并且提供了很多遍历的方法,如执行写好或者可调用的SQL语句,提供把数据库的数据封装成基本数据类型或对象,提供自定义的数据错误处理。 spring支持两种事务的管理方案: 事务传播行为指的是当存在多个事务时,spring是如何管理这些事务的 spring有5大事务隔离级别,默认值为isolation = “default”(使用数据库设置),其它四个隔离级别和数据库隔离级别一致: 名词解释: 我会选择spring的声明式事务管理,因为它的应用代码量影响最小,更符合一个轻量级容器的思想。声明式事务管理要由于编程式事务管理,虽然比编程式事务管理少了一点灵活性(代码控制事务),还有声明式事务管理只能作用于方法级别的,而编程式事务管理可以作用于代码块级别的。 OPP是指面向对象编程,运行开发者定义横向和纵向的关系,这将导致了大量的重复代码,不利于各个模块的重用。 AOP的实现关键技术在于代理模式,代理模式又分为静态代理和动态代理。 Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在具体方法前调用InvokeHandler来处理。而CGLIB动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 如何强制使用CGLIB实现AOP? JDK动态代理和CGLIB动态代理生成字节码的区别 将Advice应用于目标对象后创建的对象称为代理,在客户端对象情况下,目标对象和代理对象是相同的的。 TargetObject + Advice = Proxy 在AOP属于中,切面的工作被称为通知,实际上是程序执行时要通过spring AOP框架触发的代码段。 但是spring AOP又两种不一样的通知执行顺序: Aspect由Advice 和 pointcut组成,切面是通知点和切入点的组合,它既包含了横切逻辑的定义,也包含了连接点的定义,spring AOP就是负责实现切面的框架,它将切面定义的横切逻辑编织到切面所定义的连接点中。 可以简单的认为,使用@Aspect注解的类就是一个切面
原文链接:https://blog.csdn.net/ThinkWon/article/details/104397516
目录
1. spring 概述部分
1.1 什么是spring?
轻量级
的JavaEE开源框架,开发spring的根本使命目的是为了企业应用开发的复杂性,即简化Java开发。
spring的两个核心特性:控制反转和面向切面编程,即IOC和AOP。
spring 的特点:
1.2 spring框架的核心?
1.3 spring框架的优缺点
1.4 spring5 的主要模块构成
1.5 Spring 框架中都用到了哪些设计模式?
1.6 讲解一下核心容器(spring context应用上下文) 模块
Bean工厂是工厂模式的一个实现,提供了控制反转的功能。用来把应用的配置和依赖真正从代码中分离出来。最常用的是根据xml文件加载bean对象进IOC容器中,使得的类是ApplicationContext的实现类org.springframework.beans.factory.xml.XmlBeanFactory。2. spring的控制反转(IOC)
2.1 什么是Spring IOC 容器?
2.2 IOC 有什么作用?
2.3 使用IOC容器的优点?
2.4 spring IOC支持哪些功能
2.5 BeanFactory 和 ApplicationContext有什么区别?
依赖关系
:BeanFactory是spring中最底层的接口,包含了各种bean的定义,读取bean的配置文档,管理bean的加载,实例化,控制bean生命周期,维护bean之间的依赖关系。
而ApplicationContext作为BeanFactory 的子接口,除了BeanFactory本身的功能外,提供了更加完善的框架功能。如:
加载方式
:BeanFactory采用的是延迟加载的方式,即当我们要使用bean时调用getBean方法开始实例化bean对象。如此我们容易遇到就是在配置文件中忘记配置bean(未注入),而去调用它的getBean对象,将会抛出异常。
ApplicationContext是在容器启动后,创建所有的bean,比起BeanFactory的加载方式,采用ApplicationContext的加载更容易发现spring配置中的问题,有利于检查依赖是否注入,加载出来的单例bean对象,可以直接拿去用而不用等待。
创建方式
:BeanFactory通常以编程的形式被创建,而ApplicationContext还能以声明的形式被创建,如ContextLoader.2.6 ApplicationContext通常的实现是什么?
2.8 什么是Spring的依赖注入?
2.9 依赖注入有什么优势?
2.10 有哪些不同类型的依赖注入实现方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。2.11 构造器依赖注入和Setter方法注入的区别
构造器依赖注入
Setter方法注入
没有部分注入
有部分注入(提供setter)
不会覆盖setter属性
会覆盖setter属性
任意修改都会创建新的实例
任意修改都不会创建新的实例
适用于设置很多属性
适用于设置少量属性
3. spring 的 Bean
3.1 什么是Spring bean?
3.2 一个 Spring Bean 定义 包含什么?
3.3 如何给Spring 容器提供配置元数据?Spring有几种配置方式
3.4 Spring基于xml注入bean的几种方式
3.5 你怎样定义类的作用域?
如果spring需要bean的时候每次创建一个新的bean实例,这个时候应该使用多例,即scope = “prototype”。而如果使用一个bean对象,每次返回的是同一个bean对象,则scope = “singleton”。
基于注解开发同样有scope属性支持配置。3.6 解释Spring支持的几种bean的作用域?
3.7 Spring框架中的单例bean是线程安全的吗?
spring框架并没有对单例bean进行任何的多线程封装处理。关于单例模式下的线程安全和并发问题需要程序员自己来解决,但是对于service和dao层,通常并不需要多个实例,即没有可变状态,所以默认情况下时我们说单例时线程安全的。如果你的bean有可变状态,如Model View对象,就需要自行保证线程的安全,最直接的方法就是修改bean的作用域scope从singleton改为prototype。
3.8 Spring如何处理多线程并发问题?
通常,只有无状态的bean才可以再多线程中共享,因为它们不会导致访问的冲突情况,spring中可以将绝大部分的bean对象声明为singleton。
但是还有一些有状态的bean为什么可以在多线程中共享,如(RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等),因为它们采用了ThreadLocal进行处理,让它们也成为线程安全的状态,所以有状态的bean就可以在多线程中共享了。
ThreadLocal 和 线程同步机制都是为了解决相同的变量访问冲突问题。
线程同步机制中的处理是通过加入对象锁处理,而ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离了多线程数据的冲突访问,因为每个变量都有了自己的副本了,也就没必要对该变量进行数据同步了。ThreadLocal提供线程安全的共享对象,编写代码时,可以把哪些不安全的变量封装进ThreadLocal。
同步机制提供的是一种时间换空间的机制,多个线程只提供一个变量,让不同线程进行排队,避免了冲突的发生。
ThreadLocal采用的是一种空间换时间的方式,为每个线程都提供一个变量,因此可以同时访问而互不影响。3.9 使用@Autowired注解自动装配的过程是怎样的?
<context:annotation-config/>
由于容器类似一个一个Map结构,存储着key-value,查询机制是先从value上面找
3.10 你可以在Spring中注入一个null 和一个空字符串吗?
4. spring的常用注解
4.1 什么是基于Java的Spring注解配置? 给一些注解的例子
@Configuration:表示这是一个配置类,可以用来为IOC容器注入bean
@Bean:一般使用在配置类中,用于方法上面,将方法的返回值注入到IOC容器中,默认属性id为方法名。4.2 怎样开启注解装配?
<context:annnotation-config/>
4.3 @Component, @Controller, @Repository, @Service 有何区别?
@Controller,@Repository,@Service服务于web三层架构,分别是springMVC层,持久层,业务层,功能和@Component一样,为什么有这三个注解,因为它们更好的指明了使用意图。4.4 @Required 注解有什么作用
4.5 @Autowired 注解有什么作用
4.6 @Autowired和@Resource之间的区别
@Resource:默认是按照名称注入的,如果找不到名称匹配的bean,才会按照类型注入。4.7 @Qualifier 注解有什么作用
4.8 @RequestMapping 注解有什么用?
5. spring的数据访问
5.1 JdbcTemplate是什么
5.2 Spring支持的事务管理类型, spring 事务实现方式有哪些?
**编程式事务管理:**这意味着通过编程的方式管理事务,给你带来极大的灵活性,但是难以维护。
**声明式事务管理:**可以将业务和事务管理分开,你只需要用注解或XML配置来管理事务。5.3 说一下Spring的事务传播行为
可以在配置事务通知中配置事务属性,propagation里面有不同的取值1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新的事务,如果当前有事务,就加入该事务,常用于增删改,也是最常用的传播行为。 2. PROPAGATION_SUPPORTS:支持当前事务,如果当前有事务,就加入该事务,如果没有事务,就以非事务执行。 ------上面两种比较常见 3. PROPAGATION_MANDATORY:支持当前事务,如果当前有事务,就加入该事务,如果没有事务,就抛出异常。 4. PROPAGATION_REQUIRES_NEW:创建新事物,无论当前是否存在事务,都创建新事物。 5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把事务挂起。 6. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就抛出异常。 7. PROPAGATION_NESTED:如果当前存在事务,就在嵌套事务内执行,如果没有存在事务,就按照REQUIRED属性执行。
5.4 说一下 spring 的事务隔离?
MySQL中InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题。5.5 Spring框架的事务管理有哪些优点?
5.6 Spring框架的事务管理有哪些优点?
6. spring的面向切面编程(AOP)
6.1 什么是AOP
AOP
:面向切面编程,作为面向对象的补充,用于哪些与业务无关,但却对多个对象产生公共行为和逻辑,抽取并封装成一个可重用模块。这个模块被称为切面,减少系统中的重复代码,降低模块间的耦合度,同时提高了系统间的可维护性,可用于权限认证,日志,事务处理等。6.2 Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?
AspectJ AOP 使用的是静态代理,Spring AOP使用的是动态代理。
6.3 JDK动态代理和CGLIB动态代理的区别
1. 如果目标对象实现了接口,则默认使用JDK的动态代理实现AOP 2. 如果目标对象使用了,可以强制使用CGLIB实现AOP 3. 如果目标对象没有实现接口,则必须使用CGLIB,spring会自动在CGLIB和JDK动态代理之间切换
1. JDK动态代理只能对实现接口的类生成代理,不能针对类 2. CGLIB是针对类实现代理,主要是指定的类生成一个子类,覆盖其中方法,因为是继承,所以该类或方法最好不要声明为final
6.4 如何理解 Spring 中的代理?
6.5 解释一下Spring AOP里面的几个名词
6.6 Spring通知有哪些类型?
spring可以又5中通知类型:
1.invoke 方法中没有异常抛出 1. 前置通知 2. 方法执行 3. 后置通知 3. 最终通知 2.invoke 方法中有异常抛出 1. 前置通知 2. 方法执行 3. 异常通知通知 3. 最终通知
6.7 什么是切面 Aspect?
AOP的工作重心在于如何将增强编织目标对象的连接点。这里包含两个工作:
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算