1、spring框架

Spring框架是由于软件开发的复杂性而创建的,Spring使用的是基本的JavaBean来完成以前只可能由EB完成的事。从简单性、可测性和松耦合性角度而言,绝大部分Java应用都可以用Spring。

2、spring的优缺点

2.1、优点

  1. Spring属于低侵入设计。
  2. IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合,实现各个层之间的解耦,让我们更专注于业务逻辑。
  3. 提供面向切面编程。
  4. 对各种主流插件提供很好的集成支持。
  5. 对事务支持的很好,只要配置即可,无须手动控制。

2.2、缺点:

  1. 依赖反射,影响性能。

3、spring5新特性

  1. spring5整个框架基于java8
  2. 支持http/2
  3. Spring Web MVC支持最新API
  4. Spring WebFlux 响应式编程
  5. 支持Kotlin函数式编程

4、IOC(控制反转)

负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理这些对象的生命周期。

5、依赖注入(DI)

依赖注入是Spring实现IoC的一种重要手段,将对象间的依赖关系的控制权从开发人员手里转移到容器。

6、IOC注入的方式

  1. 构造器注入
  2. setter注入
  3. 接口注入(我们几乎不用)

7、IOC的优缺点

7.1、优点

  1. 组件之间的解耦,提高程序可维护性、灵活性。

7.2、缺点

  1. 创建对象步骤复杂,有一定学习成本。
  2. 利用反射创建对象,效率上有损。(对于代码的灵活性和可维护性来看,Spring对于我们的开发带来了很大的便利,这点损耗不算什么哦)

8、spring bean生命周期

  1. Spring 对bean进行实例化。
  2. Spring将值和bean的引用注入到bean对应的属性中。
  3. 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法。
  4. 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将bean所在的应用引用传入进来。
  5. 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用引用传入进来。
  6. 如果bean实现了BeanPostProcessor接口,Spring将调用他们的post-ProcessBeforeInitalization()方法。
  7. 如果bean实现了InitializingBean接口,Spring将调用他们的after-PropertiesSet()方法,类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用。
  8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法。
  9. 此时, bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用被销毁。
  10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

总结为4个阶段:

  1. 实例化 Instantiation

  2. 属性赋值 Populate

  3. 初始化 Initialization

  4. 销毁 Destruction

9、spring的配置方式

  1. 基于xml
  2. 基于注解
  3. 基于Java

10、spring 中的bean的作用域(scope)

  1. singleton:单例,每一个bean只创建一个对象实例。
  2. prototype,原型,每次对该bean请求调用都会生成各自的实例。
  3. request,请求,针对每次HTTP请求都会生成一个新的bean。表示在一次HTTP请求内有效。
  4. session,在一个http session中,一个bean定义对应一个bean实例。
  5. global session:在一个全局http session中,一个bean定义对应一个bean实例。

11、AOP(面向切面编程)

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

12、面向切面的通知类型

  1. 前置通知(Before):目标方法被调用之前调用通知功能。
  2. 后置通知(After):目标方法完成之后调用通。
  3. 返回通知(After-returning):目标方法成功执行之后调用通知。
  4. 异常通知(After-throwing):目标方法抛出异常后调用通知。
  5. 环绕通知(Around):在被通知的方法调用之前和调用之后执行自定义的行为。

13、连接点(Join point)

连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。

14、切点(Pointcut)

切点的定义会匹配通知所要织入的一个或多个连接点。

我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些AOP框架允许我们创建动态的切点,可以根据运行时的决策(比如方法的参数值)来决定是否应用通知。

15、切面(Aspect)

切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。

16、织入(Weaving)

织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。

17、引入(Introduction)

引入允许我们向现有的类添加新方法或属性。

18、在目标对象的生命周期里有哪些点可以织入

  1. 编译期:切面在目标类编译时被织入。

    AspectJ的织入编译器就是以这种方式织入切面的。

  2. 类加载期:切面在目标类加载到JVM时被织入。

    它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面

  3. 运行期:切面在应用运行的某个时刻被织入。

    一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。

19、AOP动态代理策略

  1. 如果目标对象实现了接口,默认采用JDK动态代理。可以强制转为CgLib实现AOP。
  2. 如果没有实现接口,采用CgLib动态代理。

20、MVC架构

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

21、Spring MVC

SpringMVC是Spring框架的一个模块。是一个基于MVC模式的框架。

22、Spring MVC的核心

DispatcherServlet:前端控制器

23、Spring MVC的核心组件

  1. DispatcherServlet:前端控制器,也叫中央控制器。相关组件都是它来调度。
  2. HandlerMapping:处理器映射器,根据URL路径映射到不同的Handlero
  3. HandlerAdapter:处理器适配器,按照HandlerAdapter的规则去执行Handler。
  4. Handler:处理器,由我们自己根据业务开发。
  5. ViewResolver:视图解析器,把逻辑视图解析成具体的视图。
  6. View :视图,一个接口,它的实现支持不同的视图类型 (freeMaker,JSP等)

24、Spring MVC的工作流程

  1. 用户请求旅程的第一站是DispatcherServlet。
  2. 收到请求后,DispatcherServlet调用HandlerMapping,获取对应的Handler。
  3. 如果有拦截器一并返回。
  4. 拿到Handler后,找到HandlerAdapter,通过它来访问Handler,并执行处理器。
  5. 执行Handler的逻辑。
  6. Handler会返回一个ModelAndView对象给DispatcherServlet。
  7. 将获得到的ModelAndView对象返回给DispatcherServlet。
  8. 请求ViewResolver解析视图,根据逻辑视图名解析成真正的View。
  9. 返回View给DispatcherServlet。
  10. DispatcherServlet对View进行渲染视图。
  11. DispatcherServlet响应用户。

25、Spring MVC的优点

  1. 具有Spring的特性。
  2. 可以支持多种视图(jsp,freemaker)等。
  3. 配置方便。
  4. 非侵入。
  5. 分层更清晰,利于团队开发的代码维护,以及可读性好。

26、单例bean是否线程安全?

不是。

27、spring实现自动装配

组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean.

自动装配(autowiring):Spring自动满足bean之间的依赖。

28、bean注解

  1. @Component:普通bran
  2. @Service:有表示service层的含义
  3. @Repository:有表示mapper层的含义
  4. @Controller:有表示controller层的含义

29、spring支持的ORM

  1. Hibernate
  2. iBatis
  3. JPA (Java Persistence API)
  4. TopLink
  5. JDO (Java Data Objects)
  6. OJB

30、spring常用注解

  1. @Repository:dao层注解,扫描注册bean
  2. @Value:将常量,配置中的变量值等注入变量中。
  3. @Controller:定制控制器
  4. @Aspect:声明一个切面
  5. @RequestMapping:映射web请求
  6. @ResponseBody:作用是将返回对象通过适当的转换器转成置顶格式,写进response的body区。通常用来返回json、xml等。
  7. @RestController:等于@ResponseBody + @Controller
  8. @PathVariable:接收路径参数
  9. @Cacheable:标记缓存查询
  10. @CacheEvict:清空缓存
  11. @Component:泛指组件,不好归类时使用它
  12. @Qualifier:当创建多个相同类型的bean时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用@Qualifier注释和@Autowired 注释通过指定哪一个真正的bean将会被装配来消除混乱。
  13. @Transaction:开启事务的注解

31、BeanFactory和ApplicationContext的区别

BeanFactory

  1. 它使用懒加载
  2. 它使用语法显式提供资源对象
  3. 不支持国际化
  4. 不支持基于依赖的注解

ApplicationContext

  1. 它使用即时加载
  2. 它自己创建和管理资源对象
  3. 支持国际化
  4. 支持基于依赖的注解

32、spring实现事务的方式

声明式:

  1. xml配置文件的方式。
  2. 注解方式(在类上添加@Transaction注解)。

编码式:

  1. 提供编码的形式管理和维护事务。

33、事务传播

事务在嵌套方法调用中如何传递,具体如何传播,取决于事务传播行为。

34、事务

  1. PROPAGATION_REQUIRED:支持当前事务,如果不存在,就新建一个。
  2. PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
  3. PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常。
  4. PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务。
  6. PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常。
  7. PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行。

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

  1. 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例。
  2. 单例模式:Bean默认为单例模式。
  3. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术。
  4. 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
  5. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它 的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。

36、 Spring中Autowired和Resource关键字的区别?

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

不同点

@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

public class TestServiceImpl { 
	// 下面两种@Autowired只要使用一种即可 
	@Autowired 
	private UserDao userDao; // 用于字段上 
	
	@Autowired public void setUserDao(UserDao userDao) { // 用于属性的方法上 
		this.userDao = userDao; 
	} 
}

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

如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl { 
	@Autowired 
	@Qualifier("userDao") 
	private UserDao userDao; 
}

@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。

@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

public class TestServiceImpl { 
	// 下面两种@Resource只要使用一种即可 
	@Resource(name="userDao") 
	private UserDao userDao; // 用于字段上 
	
	@Resource(name="userDao") 
	public void setUserDao(UserDao userDao) { // 用于属性的setter方法上 
		this.userDao = userDao;
	 }
 }

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

37、@Resource装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

结束!


								什么都是短暂的,只有怀念和失去是漫长的。

更多推荐

spring & springmvc 面试题