文章目录
1.Spring的IOC和AOP怎么理解
- IoC,英文全称Inversion of Control,意为控制反转
- AOP,英文全称Aspect-Oriented Programming,意为面向切面编程
Spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用控制反转(IoC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。
IoC
控制反转,局势创建对象的控制权,被反转到了Spring框架下。因为通常实例化一个对象,都是new一个对象,但是控制反转就能够使Spring容器去new一个对象
依赖注入DI
由IoC容器动态地将某个对象所需要的外部资源,注入到组件(Controller, Service等)之中
四种注入方式(Java实现3中依赖注入)
- 注解
- set
- 构造器
- 静态工厂
装配Bean可以基于注解注入方式@Autowired与@Resource
-
@Autowired默认按类型进行自动装配(该注解属于Spring)
根据类型,默认情况下要求依赖的对象要存在,就需要@Autowired(required=false)
如果想结合名称装配,可以使用@Qualifier@Autowired @Qualifier("adminService") private AdminService adminService;
如,同一个接口,两个实现类,就可以使用该方式指定注入。
-
@Resource默认按照名称进行装配(该注解属于J2EE)
@Resource(name = "adminService") private AdminService adminService;
@Resource装配顺序(优先按照名称)
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
AOP
比如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在A、B中都加入相关操作代码,而应用AOP就可以只写一遍代码,A、B共用这段代码。并且,当A、B需要增加新的操作时, 可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。
AOP主要一般应用于签名验签、参数校验、日志记录、事务控制、权限控制、性能统计、异常处理等
切面@Aspect
- 共有功能的实现,一个存放共有功能实现的标准Java类。
当Java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面
通知
- 切面(共有功能)的具体实现,就是要给目标对象织入的事情。
根据放置的地方不同,分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。
连接点
- 程序在运行过程中能够定义插入切面(共有功能)的地点
一个类的所有方法前、后、抛出异常时等都是连接点。
切入点
- 用于定义具体实现应该切入到哪些连接点上。
比如,在上面所说的连接点的基础上,来定义切入点。我们有一个类,类里有10个方法,那就产生了几十个连接点。但是我们并不想在所有方法上都织入通知,因此切点才是我们真正需要切入通知的的地方。
目标对象
- 即将切入切面的对象
代理对象
- 被动态创建的对象
可以简单地理解为,代理对象的功能等于目标对象本身业务逻辑加上共有功能。代理对象就是,目标对象被织入共有功能后产生的对象。
比如:购买记录日志 = 购买记录 + 日志记录
2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的
Spring
- 加载spring上下文
SpringApplicationContextUtils.initApplicationContext(event.getServletContext());
- 加载配置文件
properties.load(sct.getResourceAsStream("/WEB-INF/conf/comms.properties"));
- 加载缓存
cacheManager = (CacheManager)SpringApplicationContextUtils.getBean(EsbUtils.CACHEMANAGER);
cacheManager.loadAllCache();
public class CacheManager 中定义定时线程池,1个线程
SpringBoot
那么SpringBoot项目启动的时候发生了什么?
- 根据入口类,也就是@SpringBootApplication标识的类,自动加载需要扫描指定的包中的类进行加载
- 检测其他的类上是否存在组件类的注解,例如@Component,@Controller,@Service ,如果有就交给BeanFactory实现此类对象
- 基于类的作用域描述,将实例存储到不同作用域的容器中。
3.Spring中BeanFactory和ApplicationContext的区别
BeanFactory
访问Spring bean容器的根接口,定义获取bean及bean的各种属性。
BeanFactory 只能管理单例(Singleton)Bean 的生命周期
ApplicationContext
ApplicationContext为整个应用程序提供了核心配置
1、继承了ListableBeanFactory具有beanfactory的的工厂方法
2、继承ResourceLoader使其具有以通用方式加载资源文件的能力
3、继承ApplicationEventPublisher使其具有事件传播能力
4、具有标准的管理bean生命周期的能力
5、。。。
比较
- BeanFactroy采用的是延迟加载形式来注入Bean,就是用到,才会对bean加载实例化,可能会存在一些配置问题。
- 而ApplicationContext则相反,在容器启动时,一次性创建了所有的Bean,因此当配置很多的bean时,程序启动的比较慢。
因此,BeanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 ApplicationContext 主要面对与Spring 使用的开发者。
基本都会使用 ApplicationContext 并非 BeanFactory。
4.Spring中bean的作用域有哪些,有什么区别
在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean
看到有个说,其实bean实质是一个真正实例的“配方”,根据这个配方,注入不同的依赖,控制对象的作用阈,就可以创建多个实例。
Spring中的bean默认都是单例的
<bean id="user" class="com.lee.xxx "scope="session"/>
singleton :
唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype :
每次调用getBean()时,都会创建一个新的 bean 实例。
request :
每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
session :
同一个Http Session共享一个Bean,不同的Http Session使用不同的Bean,session过期后,bean也会随之过期,该作用域仅适用于WebApplicationContext 环境。
global-session:
全局session作用域,仅仅在基于portlet的web应用中才有意义,在Spring已经没有了。
5.SpringBoot和SpringMVC区别在哪
联系
Spring在刚开始的时候使用依赖注入(DI)和代理模式(AOP)解耦应用组件,进而开发出适用于Web开发的SpringMVC,在实际开发过程当中会使用到很多样板代码,就开发出了懒人版的SpringBoot;
区别
1、SpringMVC是Spring的一个模式,是一个Web框架,提供了一个轻耦合的方式来开发Web应用,涵盖面包括前端视图开发、文件配置、后台接口逻辑开发,但是由于是web开发涉及到数据库xml的操作,服务器的大量配置相对于很繁琐。
2、SpringBoot是习惯优于配置,降低了项目搭建的难度;
3、简化了SpringMVC的配置流程,SpringBoot专注于单体微服务接口开发,和前端解耦。
6.SpringMVC原理
核心类是DispatcherServlet
HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。
HandlerAdapter接口:处理请求映射,通过注解,把请求URL映射到Controller类的方法上。
ViewResolver:根据实际配置解析实际的View类型。
流程说明:
(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。
(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
(3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。
(4)HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。
(6)ViewResolver会根据逻辑View查找实际的View。
(7)DispaterServlet把返回的Model传给View。
(8)通过View返回给请求者(浏览器)