Spring框架(面试中的基础回答)

1.简要介绍一下Spring框架

Spring是一个轻量级框架,设计原则是非侵入性的,核心是IOC容器AOP模块

通过IOC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。


IOC(控制反转)是一种编程思想,主要用来管理控制对象的生命周期和对象与对象之间的关系,通过配置文件注入,更好实现对象与对象之间的解耦。

控制的是对象的创建和销毁,即控制对象的整个生命周期;反转则表示,我们之前常用new来创建对象,现在只需要将对象的控制权交给IOC容器,由它来创建管理控制对象即可。

IOC工作原理工厂模式加反射机制)

IOC实现了工厂模式;通过读取application.xml配置文件中<bean>标签下的类,通过构造方法或者set方法注入到IOC容器中,产生BeanFactory,BeanFactory再通过getBean方法获取对象。

IOC的一个重点是:

在系统运行中,动态的向某个对象提供它所需要的其他对象。而这一点是通过DI(依赖注入)实现的。

2.Spring 依赖注入实现方式有四种:

1.接口注入(由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。);

2.setter方法注入(容器通过调用无参构造器或者无参static工厂方法,实例化bean之后,调用该bean的setter方法实现);

3.构造方法(容器通过触发一个类的构造器实现,该类有一系列参数,每个参数代表一个对其他类的依赖。);

4.注解注入(在代码中加入@Autowired(默认按类型装配)或者@Resource(默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配)等注解实现,并且需要在application.xml配置文件中配置一段特定的模版代码:)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-4.0.xsd
               http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <!-- 开启注解式事务支持 -->
    <tx:annotation-driven transaction-manager="myTransaction"/>

</beans>

这里引申出来一个新问题:

3.setter方法和构造方法的区别

首先:setter方法可以将依赖部分注入,而构造方法则是将依赖全部注入;

其次:构造方法注入被称为创建实例的第一选项,即:如果为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。

最后:对于构造方法注入,当出现A和B对象相互依赖(循环依赖):A依赖于B,B也依赖于A。此时创建对象A或者B时,Spring会抛出ObjectCurrentlyInCreationException。所以Spring可以通过setter注入,解决循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。

总结:setter方法注入和构造方法注入都可用,但是最好的解决方案就是:采用setter注入实现可选依赖,使用构造注入实现强制依赖。


AOP(面向切面编程)是对OOP(面向对象编程)的一种补充。用于将那些与业务逻辑无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,即“切面(Aspect)”。减少了系统中的重复代码,降低了模块之间的耦合度,同时也提高了系统的可维护性。一般用于日志记录、事务处理、异常处理、安全控制等。

AOP采用动态代理实现,而动态代理又是通过反射来完成(反射:在系统运行状态中,对于任意一个类都能够知道它的所有属性和方法;对于任意一个对象,都能调用其任意的方法和属性。这种动态的获取信息及动态调用对象方法的功能称为Java的反射机制。

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

4.Spring提供了五种类型通知:

(1)<aop:before>(前置通知)

在目标方法被调用之前调用通知;

(2)<aop:after>(后置通知)

在目标方法完成之后调用通知;

(3)<aop:after-returning>(正常返回通知)

在目标方法成功执行之后调用通知;

(4)<aop:after-throwing>(异常返回通知)

在目标方法抛出异常后调用通知;

(5)<aop:around>(环绕通知)

在目标方法被调用前后调用通知;

(5.Bean的生命周期:)

6.Spring中bean的scope

目前scope的取值有五种:

(1)singleton (单例-默认): 在Spring IOC 容器中只有一个实例,在初始化IOC容器的时候被创建。

(2)prototype (原型): 在Spring IOC 容器中有多个实例,在使用到此对象时被创建。

(3)request : 每HTTP 请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的request。

(4)session : 在一个HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的Session。

(5)global session : 在一个全局的HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的Application。

7.Spring注入bean方式:

(1)@ComponentScan + @Component

(2)@Configuration + @Bean

(3)@Import 配合接口进行导入

(4)使用FactoryBean

(5)实现BeanDefinitionRegistryPostProcessor进行后置处理


有三种方式为Spring容器声明Bean:(1)基于XML配置文件<bean>标签;(2)基于注解配置@service...;(3)基于JAVA配置(configuration@bean)

8.Spring基于xml注入bean有四种方式:

(1)setter方法注入;

(2)构造方法注入;

(3)静态工厂方法注入(可以直接通过类调用);

(4)实例工厂方法注入(需要有一个实例对象,才能调用它的工厂方法)

详细可参考【转载】:

史上最全的Spring面试题汇总 - 知乎

深究Spring中Bean的生命周期 - Java知音号 - 博客园

Spring中bean的四种注入方式 - 特务依昂 - 博客园

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值