1、什么是Spring框架?Spring框架有哪些主要模块
Spring是一个开源的轻量级Java 框架,目的就是简化程序开发。
Spring框架模块大体可以分为:核心Bean容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。
Spring容器作为对象容器,负责创建、管理所有的JavaBean,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。
2、什么是控制反转,什么是依赖注入
控制反转和依赖注入其实是同一个概念,从不同角度的描述而已。IOC就是把bean的生命周期管理和依赖关系交由IOC容器去控制,控制权发生了反转,所以叫控制反转。
依赖注入是IOC容器的特色功能,意思就是IOC容器帮我们完成组件(Bean)之间依赖关系的注入,常用的注入方式有三种,构造器注入,setter方法注入,工厂方法注入。
构造器注入就是调用构造器然后传参注入。
setter方法注入就结合一些注解来实现,@AutoWired 、@Resource、@Inject、@Qualifier。
工厂方法就是在配置文件中定义工厂实例,通过factory-method指定工厂方法去创建。
3、BeanFactory和ApplicationContext有什么区别
Spring 3.x以前是通过BeanFactory来实现Bean实例化,Bean生命周期的控制,分发Bean等等功能。而ApplicationContext是BeanFactory后续延伸出来的子类,具有BeanFactory的所有功能之外,还扩展了一些额外功能。
比如支持国际化,可以同时加载多个配置文件等等;
ApplicationContext常见的实现方式:
ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文。
FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
XmlWebApplicationContext:由Web应用的XML文件读取上下文。
4、Spring有几种配置方式
将Spring配置到应用开发中有以下三种方式:
1. 基于XML的配置 Spring的配置文件
2. 基于注解的配置 @Component、@Service。。。
3. 基于Java的配置 @Configuration,方法加上@Bean注解。
5、如何用Java配置的方式配置Spring
在要配置的类上面加@Configuration注解,在方法上加@Bean注解
6、如何用注解的方式配置Spring
一般在类上面用注解
@AutoWired是自动装配,优先根据bean名字来匹配,匹配不上就通过类型。
@Resource也是先根据名字,再通过类型,不过Resource可以直接指定bean名。
@Inject 和Resource也是一样的,不过Resource和Inject是JDK里自带的。
@Qualifier是和AutoWired搭配使用的,@AutoWired结合@Qualifier就能够实现指定名字。
7、解释SpringBean的生命周期
Bean的生命周期由两组回调方法组成:
1. 初始化之后调用的回调方法,init-method,bean被实例化之后调用。
2. 销毁之前调用的回调方法,destory-method,容器关闭或者重新加载之后调用。
8、SpringBean的作用域之间有什么区别
spring容器中的bean可以分为5个范围:
1、singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例
2、prototype:范围与singleton相反,为每一个bean请求提供一个实例。
3、request:自动把bean设置到request里
4、Session:自动把bean设置到session里
5、global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
9、Spring框架中的单例Beans是线程安全的吗
单实例是线程不安全的,多实例是线程安全的;单线程是线程安全的,多线程是线程不安全的
最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
多实例耗费资源,最好用单实例使用局部变量
10、请举例说明如何在Spring中注入一个Java Collection
Spring提供了四种集合类的配置元素:
<list> : 用来装配的list值。
<set> : 用来装配set的值。
<map>: 用来注入键和值可以为任何类型的键值对。<entry>
<props> : 用来注入键和值都是字符串类型的键值对。<prop>
11、解释SpringBean的自动装配
可以使用@Autowired注解来自动装配指定的bean,装配顺序是先byType再byName。还可以结合@Qualifier指定name。
12、解释自动装配模式的区别
1、no:Spring默认设置,关闭自动装配,需要使用注解或者标签明确指定依赖关系。
2、byName:根据bean名字来匹配,bean名默认是类名首字母小写。
3、byType:根据bean的类型装配,如果没有的话就抛异常。
4、constructor:构造器装配,如果没有和参数一致的构造器就会抛出异常。
5、autodetect:先根据构造器装配,没找到就根据类型装配
13、Spring框架中都用到了哪些设计模式
1、代理模式—在AOP和remoting中被用的比较多。
2、单例模式—在spring配置文件中定义的bean默认为单例模式。
3、模板模式—用来解决代码重复的问题。比如 RestTemplate、JdbcTemplate, JpaTemplate。
4、工厂模式—BeanFactory用来创建对象的实例。
5、依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。
6、前端控制器—Spring提供了DispatcherServlet来对请求进行分发。就是有一个中央处理器,对请求进行处理,处理完在跳回去
7、视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
14、Spring事务介绍
Spring有两种事务,编程式和声明式。
编程式就是JDBC的事务管理,这种方式需要自己调commit、rollback控制事务,代码重复且量大。
声明式事务可以通过配置文件配置和注解声明。Spring提供了一个管理事务的基础接口:PlatformTransactionManager,所有持久层框架的事务管理器都是实现这个接口,Spring自身和MyBatis就是通过实现类DataSourceTransactionManager实现事务管理的。
配置过程:引入aop,tx schema,声明事务管理器,将DataSource注入到事务管理器。
定义通知(tx:advice),注入事务管理器,声明需要代理的方法,指定转播特性、是否只读。
最后定义切点(aop:config、aop:pointcut),将切点和通知关联到一起。
DataSource类型(选问):dbcp、c3p0、druid,其中druid提供SQL监控功能。
15、Spring传播特性
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
1、PROPAGATION_REQUIRED:有事务就用当前事务,没有就创建一个
2、PROPAGATION_SUPPORTS:有事务就用,没有就不用
3、PROPAGATION_MANDATORY:有事务就用,没有就抛出异常
4、PROPAGATION_REQUIRES_NEW:新建一个事务,如果有事务把它挂起来
5、PROPAGATION_NOT_SUPPORTED: 不用事务,有事务也不用
6、PROPAGATION_NEVER:不用事务,如果有事务,则抛出异常。
7、PROPAGATION_NESTED:两个事务一起执行,如果没有就创建一个
Jdbc的事务是自动提交
16、什么是AOP,AOP的作用是什么
AOP意思是面向切面编程,是对OOP的一种补充,在运行时,动态地将代码切入到类的指定方法、指定位置上,编程思想就是面向切面的编程。Spring的事务管理就是通过AOP实现的
17、AOP里面重要的几个名词概念解释
切点(PointCut):切点在Spring中的体现是个支持模糊匹配的表达式,用于匹配符合特定规则的方法,。
连接点(JoinPoint):当某个方法特定的方法被调用时,这个方法调用的位置就是连接点,就是一个触发时机。
通知(Advice):也称为增强处理,在连接点上执行的动作,通知又分为环绕通知,前置通知、后置通知、异常通知等等,不同的通知执行时机也不同,比如前置通知就是在连接点执行之前,后置通知就是连接点执行之后,异常通知就是连接点执行过程中发生异常时触发的。