什么是IOC
Spring框架提供的一种容器,用于控制对象的创建和对象之间的调用,通过IOC容器把对象的创建和调用过程交给Spring进行管理,省去了使用 new的方式创建对象。
所谓依赖注入(DI),就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中,得出依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
什么是AOP
面向切面编程,用于将业务无关却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用降低耦合。
aop实现:主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关"方面"的代码。
spring实现AOP
1、jdk动态代理:代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。
2、CGLIB动态代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。
aop使用场景
记录操作日志、缓存、spring事务等
记录操作日志:使用aop中的环绕通知+切点表达式(记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等)并保存到数据库。
spring aop
spring事务是如何实现的
本质是通过aop实现的,对方法前后进行拦截。在执行方法之前开启事务,在执行目标方法之后根据方法的执行情况提交或回滚事务。
spring事务失效场景
情况1:异常捕获处理(try—catch)
原因:事务通知只有捕捉到目标抛出的异常,才能进行回滚处理。若目标自己处理掉异常,事务通知捕捉不到异常,自然就无法执行回滚操作。
情况2:抛出检查异常
原因:spring默认只会回滚非检查异常
解决方案:配置rollbackFor 属性 @Transactional(rollbackFor = Exception.class)
检查异常和非检查异常的区别
Java中的异常分为两种:检查异常和非检查异常 / 运行时异常,具体的区别如下:
检查异常是指需要在编译时使用try-catch或者throws声明的异常,如果不处理将无法编译通过。如IOException、ClassNotFoundException等。
非检查异常 / 运行时异常是指在编译时不需要try-catch或者throws声明的异常,在程序运行期间会抛出。如NullPointerException、ArrayIndexOutOfBoundsException等
情况3:事务方法访问修饰符非public,导致事务失效
原因:spring为方法创建代理、添加事务通知的前提是该方式是public的
spring框架中的单例bean时线程安全的吗?
不是线程安全的。
spring框架中有一个@Scope注解,默认的值是singleton(单例的)
因为一般注入IOC容器中的bean都是无状态的对象,没有线程安全问题,若bean中定义了可修改的成员变量,那么就要考虑线程安全问题,可以用prototype(多例)或者加锁来解决。
Bean的生命周期
Bean的生命周期
1、 通过BeanDefinition获取bean的定义信息
2、调用构造函数实例化bean
3、bean的依赖注入
4、处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
5、Bean的后置处理器BeanPostProcessor-前置
6、初始化方法(InitializingBean、init-method)
7、Bean的后置处理器BeanPostProcessor-后置
8、销毁bean
bean的生命周期
spring的循环依赖
spring的循环依赖及其解决方案
Spring MVC的执行流程
视图阶段(jsp):前后端不分离
执行流程
- 用户发送请求到DispatcherServlet(前端控制器)
- DispatcherServlet收到请求后调用HandlerMapping(处理器映射器)
- HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),一起返回给DispatcherServlet
- DispatcherServlet调用HandlerAdapter(处理器适配器)
- HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
- Controller执行完成后返回ModelAndView对象
- HandlerAdapter将Controller的执行结果(ModelAndView对象)返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewResolver(视图解析器)
- ViewResolver解析后返回具体的View(视图)
- DispatcherServlet根据View渲染视图(将模型视图填充到视图中)
- DispatcherServlet响应View给用户
SpringBoot自动配置原理
@SpringBootApplication
// @SpringBootApplication里面包含的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
@SpringBootConfiguration :此注解作用与@Configuration注解相同,用来表明当前类是一个配置类
@ComponentScan :组件扫描,默认扫描当前引导类及其子包
△@EnableAutoConfiguration:Springboot实现自动配置的核心注解
面试回答:在springboot项目中的引导类上有个注解@SpringBootApplication,这个注解封装了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan等注解,其中@EnableAutoConfiguration注解是Springboot实现自动配置的核心注解,该注解通过@Import注解导入对应的配置选择器(@Import({AutoConfigurationImportSelector.class}))
内部读取了org.springframework.boot:spring-boot-autoconfigure包下的classpath路径下META-INF/spring.factories文件中的配置类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到IOC容器中。
条件注解如@ConditionalOnClass等,这个注解的作用判断是否有对应的class文件,若有则加载此类,将这个配置类所有的Bean放入IOC容器中。
spring框架的常用注解
spring的常用注解
注解 | 说明 |
---|---|
@Component、@Controller、@Service、@Repository | 使用在类上用于实例化Bean |
@Autowired | 使用在属性上根据类型进行依赖注入 |
@Qualifier | 结合@Autowired一起使用,根据名称进行依赖注入 |
@Scope | 标注bean的作用域 ① |
@Configuration | 指定当前类为一个配置类 |
@ComponentScan | 用于spring在初始化容器时扫描的包 |
@Bean | 标注在方法上,表示将该bean添加到spring容器 |
@Import | 使用@Import导入的类会被加载到spring容器 |
@Aspect、@Before、@after、@Around、@Pointcut | 用于aop 详见 |
① bean的作用域
作用域 | 描述 |
---|---|
singleton | (默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。 |
prototype | 将单个 bean 定义限定为任意数量的对象实例 |
request | 将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在web类型的 ApplicationContext 有效。 |
session | 将单个 bean 定义限定为 HTTP 会话的生命周期。仅在web类型的 ApplicationContext 有效。 |
application | 将单个 bean 定义限定为 ServletContext 的生命周期。仅在web类型的 ApplicationContext 有效。 |
websocket | 将单个 bean 定义限定为 WebSocket 的生命周期。仅在web类型的 ApplicationContext 有效。 |
spring mvc常用注解
注解 | 说明 |
---|---|
@RequestMapping | 用于请求映射路径,可以用在方法或类上。用在类上表示当前类中所有的方法都以此路径为父路径 |
@RequestBody | 接收http请求的JSON数据,将JSON转换成java对象 |
@RequestParam | 指定请求参数的名称,如:/user?name=hh 请求中的name属性@RequestParam(“name”) |
@PathViriable | 从请求路径下获取请求参数,如:/user/{id} 使用@PathViriable("id) |
@ResponseBody | 将返回对象转换成JSON数据并响应给前端 |
@RequestHeader | 获取指定的请求头 |
@RestController | 等价于@Controller + @ResponseBody |
springboot常用注解
注解 | 说明 |
---|---|
@SpringBootConfiguration | 组合了@Configuration注解,实现文件配置功能 |
@EnableAutoConfiguration | 打开或关闭自动配置功能 |
@ComponentScan | spring组件扫描 |