spring面试篇

Spring: 是一个轻量级的IOC和AOP容器的开源框架。目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。

(核心对象之间的解耦 IOC   核心与非核心对象之间的解耦 AOP)

1Spring 的优点?

(1)spring属于低侵入式设计,代码的污染极低;

(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;

(3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。

(4)spring对于主流的应用框架提供了集成支持。

2、可以直接使用工厂模式呀。工厂模式也可以管理实例的初始化呀,为什么一定要使用Spring呢?

因为IOC是通过反射机制来实现的。当我们的需求出现变动时,工厂模式会需要进行相应的变化。但是IOC的反射机制允许我们不重新编译代码,因为它的对象都是动态生成的。

2、使用Spring框架的好处是什么?

1)轻量:Spring 是轻量的,基本的版本大约2MB。

2)控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

3)面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

4)容器:Spring 包含并管理应用中对象的生命周期和配置。

5)MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架一个很好的替代品。

6)事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。

7)异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

3spring主要由以下几个模块组成:

Spring Core(核心容器):核心类库,提供IOC服务;

Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);

Spring AOP(面向切面):AOP服务;

Spring DAO(持久层模块):对JDBC的抽象,简化了数据访问异常的处理;

Spring ORM(对象实体映射):提供了与多个第三方持久层框架的良好整合;

Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;

Spring MVC:提供面向Web应用的Model-View-Controller实现。

4、什么是控制反转(IOC)?什么是依赖注入?区别是什么?

IOC(Inverse of Control)控制反转:创建(UserService)对象控制权交由Spring框架来管理。

将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合。

DIDependency Injection 依赖注入:在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件(将对象依赖属性通过配置进行注入)。

 

依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?

5、在 Java 中依赖注入有以下三种实现方式:

A. 接口注入  B.构造器注入 C.Setter 方法注入

6、区分构造函数(方法)注入和 setter 注入。

构造函数注入

setter 注入

没有部分注入

有部分注入

不会覆盖 setter 属性

会覆盖 setter 属性

任意修改都会创建一个新实例

任意修改不会创建一个新实例

适用于设置很多属性

适用于设置少量属性

7、说说 IOC 容器的初始化过程?

Resource 定位:我们一般使用外部资源来描述 Bean 对象,所以 IOC 容器第一步就是需要定位 Resource 外部资源 。Resource 的定位其实就是 BeanDefinition 的资源定位,它是由 ResourceLoader 通过统一的 Resource 接口来完成的,这个 Resource 对各种形式的 BeanDefinition 的使用都提供了统一接口 。

载入:第二个过程就是 BeanDefinition 的载入 ,BeanDefinitionReader 读取 , 解析 Resource 定位的资源,也就是将用户定义好的 Bean 表示成 IOC 容器的内部数据结构也就是 BeanDefinition, 在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,通过这样的数据结构, IOC 容器能够对 Bean 进行更好的管理。在配置文件中每一个都对应着一个 BeanDefinition 对象 。

注册:第三个过程则是注册,即向 IOC 容器注册这些 BeanDefinition ,这个过程是通过 BeanDefinitionRegistery 接口来实现的 。

8IOC的优点是什么?(列举IOC的一些好处)

1)IOC 或 依赖注入把应用的代码量降到最低。

2)它使应用容易测试,单元测试不再需要单例和JNDI查找机制。

3)最小的代价和最小的侵入性使松散耦合得以实现。

4)  IOC容器支持加载服务时的饿汉式初始化和懒加载。

9、在 Spring 中,有几种配置 Bean 的方式?(Spring 提供几种配置方式来设置元数据?)

1)基于XML的配置 2)基于注解的配置 3)基于Java的配置

10BeanFactoryFactoryBean.

BeanFactory:以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂

FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。

10BeanFactoryApplicationContext有什么区别?

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContextBeanFactory的子接口

1BeanFactory:是Spring里面最底层的接口,提供了最简单的容器功能,只提供了实例化对象和纳对象功能。(包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。)ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:支持国际化功能,消息返送,响应机制,统一加载资源功能,强大的事件机制,对web应用的支持。

①继承MessageSource,因此支持国际化。  ②统一的资源文件访问方式。   

③提供在监听器中注册bean的事件。      ④同时加载多个配置文件。

⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,如应用的web层。

2BeanFactroy采用的是延迟加载形式来注入Bean,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。

        ②ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。

        ③相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

3BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。

4都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

11ApplicationContext通常的实现是什么?

1ClassPathXmlApplicationContext从 classpath 的 XML 配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。

 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

2FileSystemXmlApplicationContext文件系统中的 XML 配置文件读取上下文,载入bean定义的信息。XML Bean 配置文件的全路径名必须提供给它的构造函数。

ApplicationContext context = new FileSystemXmlApplicationContext(“application.xml”);

3XmlWebApplicationContext由 Web 应用的 XML 文件读取上下文。从Web系统中的XML文件来载入所有Bean定义的信息。

ServletContext servletContext = request.getSession().getServletContext();    

ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

11、配置WebApplicationContext的两种方法?

1)利用Listener接口来实现  2)利用Servlet接口来实现

12web.xml 文件中可以配置哪些内容?

web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。

12BeanFactory 实现举例。

Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正在应用代码中分离。

最常用的BeanFactory 实现是XmlBeanFactory 类。

13XMLBeanFactory 

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。

14Spring的核心类有哪些,各有什么作用?

BeanFactory产生一个新的实例,可以实现单例模式

BeanWrapper提供统一的get及set方法

ApplicationContext提供框架的实现,包括BeanFactory的所有功能

BeanFactory 和 ApplicationContext 就是 spring 框架的两个 IOC 容器,现在一般使用 ApplicationContext,其不但包含了 BeanFactory 的作用,同时还进行更多的扩展。

15、什么是AOPAOP的作用是什么?

面向切面编程(AOP):AOP将整个系统划分为核心的业务逻辑模块和非核心的通用服务模块。AOP的关注点是非核心通用服务部分,将非核心部分封装成一种AOP组件。不需要传统OOP中对象继承或者方法调用方式;只需要在xml文件中以配置、引用的方式描述AOP组件需要添加给哪些核心对象,从而降低对象之间的耦合性。作为OOP的延续思想添加到企业开发中。弥补OOP开发过程中缺陷不足[继承、方法调用]而提出的编程思想

除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。

Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP 提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强

16SpringAOP理解:(说说 AOP 的实现原理?动态代理的方式有哪些?)

OOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。

AOP实现原理:是通过动态代理的方式为程序添加统一功能,集中解决一些公共问题 。

 

AOP实现的关键在于代理模式,AOP代理主要分为静态代理动态代理

静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

 

(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理,动态代理就是AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

(3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

        ①JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例,  生成目标类的代理对象。(简单来说JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口 JDK 动态代理的核心是 InvocationHandler 接口和 Proxy )

        ②如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

 InvocationHandler 的 invoke(Object  proxy,Method  method,Object[] args):proxy是最终生成的代理实例;  method 是被代理目标实例的某个具体方法;  args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。

17、解释一下Spring AOP里面的几个名词:

1)切面(Aspect):被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。

2)连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。 

3)通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。

4)切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add*、search*。

5)引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

6)目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

7)织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。

切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。

18Spring通知有哪些类型?

1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

2)返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 

3)抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。 

4)后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 

5)环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。 

同一个aspect,不同advice的执行顺序:

没有异常情况下的执行顺序:

around before advice

before advice

target method 执行

around after advice

after advice

afterReturning

有异常情况下的执行顺序:

around before advice

before advice

target method 执行

around after advice

after advice

afterThrowing:异常发生

java.lang.RuntimeException: 异常发生

19AOP 的应用场景 AOP 好处?

AOP–Aspect Oriented Programming 面向切面编程;用来封装横切关注点,

具体可以在下面的场景中使用:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

logging, tracing, profiling and monitoring 记录跟踪优化校准

Performance optimization  性能优化

Persistence 持久化

Resource pooling  资源池

Synchronization  同步

Transactions 事务

优点:

* 各个步骤之间的良好隔离性耦合性大大降低 。

* 源代码无关性,再扩展功能的同时不对源码进行修改操作。

19springAOP是怎么影响代码的

配置切面的方式 将核心代码和非核心服务进行动态分离(解耦)

20、请解释Spring Bean的生命周期?

(1)bean定义     在配置文件里面用<bean></bean>来进行定义。

(2)bean初始化   有两种方式初始化:

A.在配置文件中通过指定init-method属性来完成

B.实现org.springframwork.beans.factory.InitializingBean接口

(3)bean调用     有三种方式可以得到bean实例,并进行调用

(4)bean销毁     销毁有两种方式

A.使用配置文件指定的destroy-method属性

B.实现org.springframwork.bean.factory.DisposeableBean接口

 Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;

 Spring上下文中的Bean生命周期也类似,如下:

1)实例化Bean

对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

2)设置对象属性(依赖注入):

实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。

3)处理Aware接口:

接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:

①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;

②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。

③如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;

4BeanPostProcessor

如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。BeanPostProcessor经常被用作是bean内容的过呢更改,并且由于这个方法是在Bean初始化结束时调用after方法,也可以被应用于内存或缓存技术;

5InitializingBean  init-method

如果Bean在Spring配置文件中配置 init-method 属性,则会自动调用其配置初始化方法。

6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;

以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。

7DisposableBean

当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

8destroy-method

最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

20Spring Bean 生命周期

1.Spring 容器 从 XML 文件中读取 Bean 的定义,并实例化 Bean。

2.Spring 根据 Bean 的定义填充所有的属性。

3.如果 Bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。

4.如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递 beanfactory 给 setBeanFactory 方法。

5.如 果 有 任 何 与 bean 相 关 联 的 BeanPostProcessors , Spring 会 在postProcesserBeforeInitialization()方法内调用它们。

6.如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。

7.如果有 BeanPostProcessors 和 bean 关联,这些 bean 的 postProcessAfterInitialization()

方法将被调用。

8.如果 bean 实现了 DisposableBean,它将调用 destroy()方法。注意:

有两个重要的 bean 生命周期方法,第一个是 setup(),它是在容器加载 bean 的时候被调用。第二个方法是 teardown() 它是在容器卸载类的时候被调用。

The bean 标签有两个重要的属性 init-method 和 destroy-method。使用它们你可以自己定制初始化和注销方法。它们也有相应的注解@PostConstruct 和@PreDestroy。

21、解释Spring支持的几种bean的作用域。

Spring容器中的bean可以分为5个范围:

1singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。

2prototype为每一个bean请求提供一个实例。每个bean实例都有自己的属性和状态。

3request为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

4session与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

5global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。(简短的说:在一个全局的http session中,容器会返回该bean的同一个实例,仅在使用portlet context时有效。

22spring配置bean实例化有哪些方式?

1)使用类构造器实例化(默认无参数)

<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>

2)使用静态工厂方法实例化(简单工厂模式)

//下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2

<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>

 3)使用实例工厂方法实例化(工厂方法模式)

//先创建工厂实例bean3Facory,再通过工厂实例创建目标bean实例

<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

22Spring框架中的单例Beans是线程安全的么?

        Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”

23、哪些是重要的bean生命周期方法? 你能重载它们吗?

有两个重要的bean 生命周期方法,第一个是setup,它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。

The bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。

24、什么是Spring的内部bean

当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在 <property/>或 <constructor-arg/> 元素内使用<bean/> 元素,内部bean通常是匿名的,它们的Scope一般是prototype。

25Spring的自动装配:

在spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式。

Spring框架xml配置中共有5种自动装配:

(1)no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。

(2)byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。 

(3)byType:通过参数的数据类型进行自动装配。

(4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。

(5)autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。

基于注解的方式:

使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,<context:annotation-config />。在启动spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IOC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

如果查询的结果不止一个,那么@Autowired会根据名称来查找;

如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

@Autowired可用于:构造函数、成员变量、Setter方法

注:@Autowired@Resource之间的区别

(1) @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。

(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

26、自动装配有哪些局限性 ?

  • 重写: 你仍需用 <constructor-arg>和 <property> 配置来定义依赖,意味着总要重写自动装配。
  • 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,类。
  • 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

27、什么是bean装配

装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

28、什么是bean的自动装配?

Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。

29、什么是基于JavaSpring注解配置? 给一些注解的例子.

基于Java的配置,允许在少量的Java注解的帮助下,进行大部分Spring配置而非通过XML文件。

以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。

30、什么是基于注解的容器配置?

相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号声明。

开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

31、怎样开启注解装配?

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素。

32Spring如何处理线程并发问题?

  • 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
  • ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。
  • ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

33、在 Spring中如何注入一个java集合?

Spring提供以下几种集合的配置元素:

  • <list> 类型用于注入一列值允许有相同的值。
  • <set> 类型用于注入一组值不允许有相同的值。
  • <map> 类型用于注入一组键值对,键和值都可以为任意类型
  • <props>类型用于注入一组键值对,键和值都只能为String类型

34、你可以在Spring中注入一个null 和一个空字符串吗?  可以

35Spring 框架中都用到了哪些设计模式?

1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例。

2)单例模式:Bean默认为单例模式。

3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术。

4)模板方法模式:用来解决代码重复问题Eg:RestTemplate, JmsTemplate, JpaTemplate。

5)前端控制器模式:spring提供了DispatcherServlet来对请求进行分发。

6)依赖注入模式:贯穿Bean/ApplicationContext接口的核心理念。

7)观察者模式:定义对象键一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新。eg:Spring中listener实现ApplicationListener。

36Spring 管理事务的方式有几种(Spring事务的种类)?

1、编程式事务:使用TransactionTemplate,在代码中硬编码。(不推荐使用)

2、声明式事务:底层采用AOP技术实现, 在配置文件中配置(推荐使用)

声明式事务又分为两种:a、基于XML的声明式事务   b、基于注解的声明式事务

37Spring 框架的

事务管理有哪些优点?

它为不同的事务API如JTA,JDBC,Hibernate,JPA和JDO提供一个不变的编程模式 。

它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API。

它支持声明式事务管理 。它和 Spring 各种数据访问抽象层很好的集成 。

38Spring事务的实现方式和实现原理:

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。

1Spring事务的种类:

  • 编程式事务管理:使用TransactionTemplate。
  • 声明式事务管理:建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。

声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别

事务:事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

事务特性(4种):

原子性 (atomicity):强调事务的不可分割.

一致性 (consistency):事务的执行的前后数据的完整性保持一致.

隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰

持久性(durability) :事务一旦结束,数据就持久到数据库

2spring的事务传播行为:

spring事务的传播行为:当多个事务同时存在的时候,spring如何处理这些事务的行为。

PROPAGATION_REQUIRED如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

PROPAGATION_SUPPORTS支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

3Spring中的隔离级别:

① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。

② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。

③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。

④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。

⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。

如果不考虑隔离性引发安全性问题: 
脏读 :一个事务读到了另一个事务的未提交的数据 
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致. 
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

39Spring框架中有哪些不同类型的事件?

Spring 提供了以下5种标准的事件:

(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。

(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。

(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。

(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。

(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。

如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。

39spring事务 xml配置的怎么配?

配置hibernate事务配置放啊

1)配置sessionFactory 2)配置事务容器 3)配置事务规则 4)配置事务入口

40Spring 中常见的创建对象的注解有哪些?

@Component  @Controller  @Service  @Repository

41@Component, @Controller, @Repository, @Service 有何区别?

  1. @Component:将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
  2. @Controller:将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IOC 容器中。
  3. @Service:组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好方式指定了意图。
  4. @Repository:具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将DAO导入IOC容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

42Spring 如何保证 Controller 并发的安全

a.尽量不在Controller中使用实例变量。这样可以很大程度保证线程安全性了。 

b. 在使用Spring开发项目时默认情况下Controller、Service、DAO都是单例模式。

c.需要每次都要创建新的Controller,同时Spring的配置文件中要将Controller的作用域声明为原型(prototype)

d. 在控制器中要使用ThreadLocal变量

43spring的工作流程

1)获取spring framework jar 包   获取Apache common 的jar包

2)搭建第一个用到spring依赖注入的程序    a:建一个工程   b:添加jar包

3)配置xml 把bean配置到spring的xml中

4)依赖注入

a:新建个实体类 用于注入b:把类通过xml配置注入c:创建测试类d:运行结果

44、下面是几种比较重要的注解类型:

1.@Required:该注解应用于设值方法。

2.@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

3.@Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧义。

4.JSR-250 Annotations :Spring 支持 基于 JSR-250 注解 的以下 注解 ,@Resource、

@PostConstruct 和 @PreDestroy。

45AOP如何配置事务

在使用AOP配置声明式事务之前,先确定当前工程持久层采用的技(jdbc/mybatis/hibernate)

1)根据选用的技术配置事务管理器(DataSourceTransactionManager/HibernateTransactionManager)

2)配置事务通知bean

为其注入事务管理器,来控制事务通知bean中事务对象的管理(创建、提交、回滚等操作)

为不同的方法设置不同的事务属性(那四个属性)

由于声明式事务回滚的方式是抛出运行时异常,可以在此阶段配置 当遇到哪种异常时回滚事务

3)配置AOP切入点   通过切入点表达式指向到需要添加事务管理的一组类/方法

4)配置AOP切面     通过引用事务通知bean和切入点,组装事务切面。

45Spring里面如何配置数据库驱动?

使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:

<bean id=”dataSource”> 

    <property name=”driverClassName”> 

        <value>org.hsqldb.jdbcDriver</value>

    </property> 

    <property name=”url”> 

        <value>jdbc:hsqldb:db/appfuse</value> 

    </property> 

    <property name=”username”><value>abc</value></property> 

    <property name=”password”><value>abc</value></property> 

</bean> 

46Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下: 

<listener> 

    <listener-class>org.springframework.web.context.ContextLoaderListener

        <context-param> 

         <param-name>contextConfigLocation</param-name> 

         <param-value>/WEB-INF/xyz.xml</param-value> 

        </context-param>   

    </listener-class> 

</listener> 

47Spring里面如何定义hibernate mapping

添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:

<property name=”mappingResources”> 

    <list> 

        <value>org/appfuse/model/User.hbm.xml</value> 

    </list> 

</property>

47spring怎么整合hibernate?

    提供一个模板模式的实现类 HibernateTemplate 封装传统hiberante开发流程

    通过在DAO中对模板类的使用实现对传统开发流程的代替

    在IOC容器中配置HibernateTemplate

    配置SessionFactory

        LocalSessionFactoryBean

        AnnoationSessionFactoryBean

            数据源 DataSource

            映射文件/实体 MappingResource  annotatedClasses

            方言 ......

    HibernateTemplate提供了哪些方法

    save(Object)

    delete()

    update()

    get() load()[load的查询阶段必须存在会话]

    find()

    execute(new HibernateCallback(){doInHibernate(Session session){}})

47spring整合struts

    1.使用spring的IOC容器管理struts中用于处理请求的action。将action配置成IOC容器中的bean

    2.action的实例化时间  action的实例化状态

    3.struts2提供的插件 struts-spring-plugin.jar

        struts-plugin.xml

            <package >

                <bean name="spring" class="StrutsSpringObjectFactory"/>

 

    StrutsSpringObjectFactory

        会接收ActionInvocation传给他的<action class="">

        根据class属性指向的内容在IOC容器中查找匹配的bean

 

48、如何理解 Spring 中的代理?

将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。

Advice + Target Object = Proxy

49Spring5 新特性

1、依赖 JDK 8+和 Java EE7+以上版本

2、首次采用反应式编程模型   3、支持使用注解进行编程

4、新增函数式编程           5、支持 HTTP 2.0

6、新增 Kotlin 和 Spring WebFlux

7、支持使用 REST 断点执行反应式编程   

8、可使用 Lambda 表达式注册 Bean

9、Spring WebMVC 支持最新的 API

10、使用 JUnit5 执行条件和并发测试

11、使用 Spring WebFlux 执行集成测试

12、核心容器优化

49spring主要由以下几个模块组成:

  • Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:

Spring Core

Spring Bean

SpEL (Spring Expression Language)

Spring Context

  • 数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:

JDBC (Java DataBase Connectivity)

ORM (Object Relational Mapping)

OXM (Object XML Mappers)

JMS (Java Messaging Service)

Transaction

  • Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:

Web

Web – Servlet

Web – Socket

Web – Portlet

  • AOP – 该层支持面向切面编程

Instrumentation – 该层为类检测和类加载器实现提供支持。

Test – 该层为使用 JUnit 和 TestNG 进行测试提供支持。

  • 几个杂项模块:

Messaging – 该模块为 STOMP 提供支持。它还支持注解编程模型,该模型用于从 WebSocket 客户端路由和处理 STOMP 消息。

Aspects – 该模块为与 AspectJ 的集成提供支持。

Spring面向切面编程(AOP

51. 解释AOP

面向切面的编程,或AOP 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

52. Aspect 切面

AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

52. Spring AOP 中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。

横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

54. 连接点

连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

55. 通知

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

56. 切点

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

57. 什么是引入?

引入允许我们在已存在的类中增加新的方法和属性。

58. 什么是目标对象?

被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

59. 什么是代理?

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

60. 有几种不同类型的自动代理?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

61. 什么是织入。什么是织入应用的不同点?

织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。

织入可以在编译时,加载时,或运行时完成。

62. 解释基于XML Schema方式的切面实现。

在这种情况下,切面由常规类以及基于XML的配置实现。

63. 解释基于注解的切面实现

在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值