9、Spring面试题

文章目录

1、什么是 Spring 框架?

Spring是一个轻量级的Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题

Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发


2、Spring IOC 和 AOP

Spring IOC


IOC(Inverse of Control)控制反转:是一种设计思想,DI(依赖注入)是实现IOC的一种方式,就是将原本在程序中手动创建对象(new 对象)的控制权,交由Spring框架来管理。将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC 容器就像一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的

  • 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
  • 反转:程序本身不创建对象,而变成被动的接收对象
  • 依赖注入:利用set方法来进行注入

链接:走你


Spring AOP


AOP(Aspect-Oriented Programming 面向切面编程):可以将那些与业务无关,但是可以将和业务模块所共同调用的逻辑(eg:事务,日志,权限)封装起来,以便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性

Spring AOP就是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP会使用JDK Proxy去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy去进行代理了,这时候Spring AOP会使用Cglib,这时候Spring AOP会使用Cglib生成一个被代理对象的子类来作为代理


3、Spring的优缺点?

优点:

  • 方便解耦,简化开发
    Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理
  • AOP编程的支持
    Spring提供面向切面编程,可以方便的实现对程序的权限拦截、运行监控等功能
  • 声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程
  • 方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序
  • 方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)

缺点:

  • Spring是一个轻量级的框架,但是给人的感觉很大
  • 使用门槛升高,入门Spring需要较长时间
  • Spring依赖反射,反射影响性能

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

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

5、Spring支持的几种bean的作用域

  • singleton:bean在每个Spring IOC容器中只有一个实例
  • prototype:一个bean的定义可以有多个实例
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

6、spring 自动装配 bean 有哪些方式?

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

  • no:默认的方式是(no)不进行自动装配的,通过手工设置ref属性来进行装配bean
  • byName:通过bean的名称进行自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配
  • byType:通过参数的数据类型进行自动装配
  • constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配
  • autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用byType的方式自动装配

7、Spring注解

配置注解的支持

	<context:annotation-config/>
  1. @Component:泛指组件,将java类标记为bean,当组件不好归类时,可以使用这个注解进行标注
  2. @Controller:用于标注控制层组件
  3. @Service:用于标注业务层组件
  4. @Repository: 用于标注数据访问层组件
  5. @Required:这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配
  6. @Autowired:默认是按照类型装配注入的
  7. @Qualifier@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配,@Qualifier`不能单独使用

8、@Autowired与@Resource区别

  • @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上
  • @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
  • @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配
  • 它们的作用相同都是用注解方式注入对象,但执行顺序不同@Autowired通过byType方式实现,@Resource通过byName方式实现

9、动态代理

动态代理分为两类

  • 基于接口的动态代理 — JDK动态代理
  • 基于类的动态代理 — cglib

JDK动态代理

核心 : InvocationHandler 和 Proxy

  • InvocationHandler是由代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法
  • JDK动态代理的特点:被代理的类实现接口

10、Spring的AOP的通知类型有哪些

  • 前置通知
  • 后置通知
  • 最终通知
  • 环绕通知
  • 异常通知

11、Spring的AOP应用包括

  • 用AOP声明性事务代替EJB的企业服务
  • 用AOP做日志处理
  • 用AOP做权限控制,如Spring Security

12、Spring AOP的名词?

  • 切面(ASPECT):横切关注点被模块化的特殊对象
  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法
  • 目标(Target):被通知对象
  • 代理(Proxy):向目标对象应用通知之后创建的对象
  • 切入点(PointCut):切面通知执行的“地点”的定义
  • 连接点(JoinPoint):与切入点匹配的执行点
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值