Java常见面试题(三)

SSM框架部分

Spring

  1. 什么是 Spring框架?Spring框架有哪些主要模块?
    Spring框架是一个轻量级的Java开发框架,为应用开发提供平台。
    Spring框架主要包括7个模块
    Spring AOP 面向切面编程
    Spring ORM Hibernate|mybatis|JDO
    Spring Core 提供bean工厂 IOC
    Spring Dao JDBC支持
    Spring Context 提供了关于UI支持,邮件支持等
    Spring Web 提供了web的一些工具类的支持
    Spring MVC 提供了web mvc , webviews , jsp ,pdf ,export
  2. 使用Spring框架能带来哪些好处?
    (1)Dependency Injection(DI)方法使得构造器和JavaBean properties文件中的依赖关系一目了然。
    (2)与EJB容器相比较,IOC容器更加趋向于轻量级。这样一来IOC容器在邮箱的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。
    (3)Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。
    (4)Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。
    (5)要测试一项用Spring开发的应用程序十分简单,因为测试相关的环境代码都已经襄括在框架中了。更加简单的是,利用javaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。
    (6)Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行Web框架的以外的有力选项。
    (7)Spring提供了一个便捷的事务管理接口,适用于小型的本地事务处理(比如在单DB的环境下)和复杂的共同事务处理(比如利用JTA的复杂DB环境)。
  3. 什么是控制反转(IOC) ?什么是依赖注入(DI)?
    所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由Spring框架提供,这个由Spring框架管理对象创建和生命周期的的机制称之为控制反转
    在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过程称之为依赖注入,也即DI。
  4. BeanFactory和ApplicationContext有什么区别?
    BeanFactory: 是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能,BeanFactory在第一次getBean时初始化Bean;
    ApplicationContext: 应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能,ApplicationContext在加载配置文件时初始化Bean;
    1. 国际化(MessageSource)
    2. 访问资源,如URL和文件(ResourceLoader)
    3. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特 定的层次,比如应用的web层
    4. 消息发送、响应机制(ApplicationEventPublisher)
    5. AOP(拦截器)
  5. Spring有几种配置方式?
    Spring主要包括了三种配置bean元数据的方式:
    1) 第一阶段:显示的XML文件配置,
    2) 第二阶段:隐式的bean扫描,基于java注解配置,自动注入。
    3) 第三阶段:显示的JavaConfig,基于java代码配置。
  6. 如何用基于 XML配置的方式配置 Spring ?
    1)注解配置代码
    2)Java配置代码
    3)XML配置方法代码
  7. 如何用基于Java配置的方式配置 Spring ?
    1)创建工程以及导入依赖
    2)编写User对象
    3)编写UserDAO 用于模拟与数据库的交互
    4)编写UserService 用于实现User数据操作业务逻辑
    5)编写SpringConfig 用于实例化Spring容器
    6)编写测试方法 用于启动Spring容器
  8. 怎样用注解的方式配置Spring ?
    1)开启使用注解代理配置
    2)将对象注册到容器中
  9. 请解释 Spring Bean的生命周期?
    1)Spring对bean进行实例化,默认bean是单例;
    2)Spring对bean进行依赖注入(设置对象属性);
    3)处理Aware接口:接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean;
    4)BeanPostProcessor:如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
    5)InitializingBean 与 init-method:如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
    6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;
    以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
    7)DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
    8)destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
  10. Spring Bean的作用域之间有什么区别?
    1) singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
    2) prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
    3) request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
    4) Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
    5) global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
  11. 什么是Spring inner beans ?
    在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现。比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用。
  12. Spring框架中的单例 Beans是线程安全的么?
    Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
  13. 请举例说明如何在 Spring中注入一个 Java Collection ?
    Spring提供了以下四种集合类的配置元素:
    <list> : 该标签用来装配可重复的list值。
    <set> : 该标签用来装配没有重复的set值。
    <map>: 该标签可用来注入键和值可以为任何类型的键值对。
    <props> : 该标签支持注入键和值都是字符串类型的键值对。
  14. 如何向 Spring Bean中注入一个Java.util.Properties?
    转载自此原文链接
  15. 请解释 Spring Bean的自动装配?
    在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象。但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的<ref>标签。实际上,这种方式也会在另一种形式上增加了应用程序的复杂性,那么如何解决这个问题呢?Spring为我们提供了一个自动装配的机制,尽管这种机制不是很完善,但是在应用中结合<ref>标签还是可以大大的减少我们的劳动强度。
    <bean>元素的autowire属性负责自动装配标签定义Javabean的属性。这样做可以省去很多配置Javabean属性的标签代码,使代码整洁、美观。
  16. 请解释自动装配模式的区别?
模式 说明
Default 在每个bean中都一个autowire=default的默认配置它的含义是:采用beans和跟标签中的default-autowire="属性值"一样的设置。
No 不使用自动装配,必须通过ref元素指定依赖,默认设置。
ByNname 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(…)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
Bytype 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
Constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
Antodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
  1. 如何开启基于注解的自动装配?
    Spring容器默认禁用注解装配,所以,在使用基于注解的自动装配前,我们需要在Spring配置中启用它,最简单的启用方式是使用Spring的context命名空间配置中的<context:annotation-config>元素

  2. 请举例解释@Required注解?

  3. 请举例解释@Autowired注解?

  4. 请举例说明@Qualifier注解?
    18,19,20的答案都转载此原文

  5. 构造方法注入和设值注入有什么区别?
    1)如果依赖关系非常复杂,考虑到构造注入需要保留构造函数,那么构造函数里的内容会比较复杂,所以此时采用设值注入比较简洁。
    2)如果使用没写第三方库,可能要求组建必须提供一个默认的构造函数,此时构造注入类型的依赖注入机制就存在局限性。
    3)构造方法由于不存在set方法,不用担心上层代码在调用过程中执行set方法对组件产生印象。
    建议:采用设置注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,尽量采用构造注入;而其它的依赖关系的注入,则考虑设值注入。

  6. Spring框架中有哪些不同类型的事件?
    ContextRefreshedEvent: ApplicationContext初始化或者被更新是会触发,ConfigurableApplicationContext接口中的refresh()方法被调用会触发
    ContextStartedEvent: ConfigurableApplicationContext接口中的start()方法被调用会触发
    ContextStoppededEvent: ConfigurableApplicationContext接口中的stop()方法被调用会触发
    ContextClosedEvent: AppliactionContext被关闭时触发该事件,所有容器管理的单例bean被销毁。
    RequestHandledEvent: 当一个http请求结束时触发该事件
    如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent被发布后,遍历所有监听器,对于每一个监听器来说其实都可以获取到监听事件,但是是否进行处理则由事件监听器来决定,如果要处理,使用onApplicationEvent()方法来进行监听器的处理
    自定义监听事件,需要ApplicationEvent接口,ApplicationContext使用publishEvent()方法来发布事件。

  7. FileSystemResource和ClassPathResource有何区别?
    在FileSystemResource 中需要给出spring-config.xml文件在项目中的相对路径或者绝对路径。在ClassPathResource中Spring会在ClassPath中自动搜寻配置文件,所以要把ClassPathResource 文件放在ClassPath下。
    如果将spring-config.xml保存在了src文件夹下的话,只需给出配置文件的名称即可,因为src文件夹是默认。

    简而言之,ClassPathResource在环境变量中读取配置文件,FileSystemResource在配置文件中读取配置文件。

  8. Spring框架中都用到了哪些设计模式?
    工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
    代理设计模式 : Spring AOP 功能的实现。
    单例设计模式 : Spring 中的 Bean 默认都是单例的。
    模板方法模式 : Spring中jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就用到了模板模式。
    包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
    观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
    适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

猜你喜欢

转载自blog.csdn.net/weixin_43980936/article/details/102489819
今日推荐