什么是Spring?
spring是一个企业级应用的开源开发框架,主要用来开发java应用,spring框架目标就是简化企业级应用开发。
Spring用到了那些设计模式?
spring里面用到了大量的设计模式,这里举例比较有代表性的:
代理模式:在aop中使用比较多
单例模式:在spring配置文件定义的bean默认为单例模式
模板模式:用来解决代码重复问题
工厂模式:BeanFactory用来创建对象的实例。
使用Spring框架有什么好处?
1.轻量:spring是轻量的,基本版本大约2MB
2.控制反转;spring通过这个实现了松散耦合,对象给他们依赖,而不是创建对象
3.spring支持面向切面的编程,并且把业务逻辑和系统服务分开
4.spring容器包含管理应用中对象的声生命周期和配置
什么是Spring IOC容器?
spring IOC 负责创建对象,管理对象(通过依赖注入),装配对象,配置对象,并管理对象的生命周期
IOC的优点是什么?
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,最小的代价和最小的侵入性使松散耦合得以实现
ApplicationContext通常实现的是什么?
ClassPathXmlApplicationContext:此容器从一个xml文件中加载beans的定义。xml bean 配置文件的全路径名必须提供给他的构造函数。
WebXmlApplicationContext:此容器加载一个xml文件,此文件定义了一个WEB应用的所有bean。
Spring有几种配置方式?
基于xml的配置
基于注解的配置
基于java的配置
什么是Spring的依赖注入?
依赖注入是ioc的一个方面,是指不需要你创建对象,只需要描述对象如何创建,你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的
setting:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
构造器参数实现强制依赖,setter方法实现可选依赖
解释Spring支持几种bean的作用域?
singleton:这是默认的,单例模式,不管有多少个请求,每个容器只有一个bean实例化
prototype:它和单例相反为每一个请求提供一个实例,原型模式
request:在每一个客服端的网络请求创建一个实例,在请求完成后,bean失效并垃圾回收器回收
session:确保每一个session中有一个bean实例,在session过期后,bean会随之失效
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
Spring框架中的单例bean是线程安全的吗?
肯定不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题.
. 什么是bean的自动装配?
spring容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
自动装配有哪些局限性 ?
重写: 你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
什么是基于java的Spring注解配置?请举例
@Configuration注解,表示该类是一个配置类,用来定义bean资源
@bean:由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理 ,@Bean声明所起到的作用与 元素类似
怎么开启注解配置
注解装配默认是不开启的,使用必须在配置文件配置context:annotation-config/元素。
@Required 注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显示的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛BeanInitializationException
@Autowired 注解
;通过类型来实现自动注入bean。和@Qualifier注解配合使用可以实现根据name注入bean
@Qualifier 注解
@Autowired一块使用,在同一类型的bean有多个的情况下可以实现根据name注入的需求
@Resource 注解
默认是根据name注入bean的,可以通过设置类型来实现通过类型来注入
Spring框架支持的事务管理类型
spring支持两种类型的事务管理:
编程式事务管理:通过编程的方式管理事务,但是极难维护
声明式事务管理:可以将业务代码和事务管理分离,只需要注解和xml配置来管理事务。
你更倾向用那种事务管理类型?
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
什么是Aop
面向切面编程,是一种编程技术,允许程序模块化横向切割关注点,如日志和事务管理
在Spring AOP中关注点和横切关注点有什么不同?
关注点是一个模块的行为,一个关注点可能会被定义为我们想要实现的功能,横切关注点是贯穿整个应用程序的关注点,并影响整个应用,比如日志,数据传输
Spring有哪些不同通知类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
spring切面可以应用五种类型的通知:
before:前置通知,在一个方法执行前调用
after:在方法执行后调用的通知,无论方法是否执行成功
after-returning:仅当方法执行完成后执行的通知
after-throwing:在方法抛出异常退出时执行的通知
around在方法执行之前和执行之后都会执行的通知
Spring AOP 代理是什么?
代理是使用非常广泛的设计模式,代理是通知目标对象创建后的对象。
连接点(Joint Point)和切入点(Point cut)是什么?
连接点是程序执行的一个点,例如,一个方法的执行或者一个异常的处理,一个连接点总是代表一个方法执行。举例来说,所有定义在你的 EmpoyeeManager 接口中的方法都可以被认为是一个连接点,如果你在这些方法上使用横切关注点的话。
切入点是一个匹配连接点的断言或者表达式。Advice 与切入点表达式相关联,并在切入点匹配的任何连接点处运行(比如,表达式 execution(* EmployeeManager.getEmployeeById(…)) 可以匹配 EmployeeManager 接口的 getEmployeeById() )
什么是织入。什么是织入应用的不同点?
织入是将切面和其他应用类型或对象连接或创建一个通知对象的过程。
织入可以在编译时,加载时或运行时完成。