Spring相关知识点
Spring
什么是IOC?
IOC(Inversion Of Controller)控制反转,一种思想,而不是技术。解决Java开发领域对象的创建和管理问题。
IOC容器是Spring实现IOC的载体。IOC容器本质上是Map<key, value>
,存储的是object对象。
什么是DI?
DI(Dependency Injection)是实现依赖注入最常见和合理的方式。
依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不开谁。简单来说,a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外的容器处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么通过a的接口,把b传入;通过a的构造,把b传入;通过设置a的属性,把b传入;这个过程叫依赖注入(DI)。
那么什么是IOC Container?随着DI的频繁使用,要实现IOC,会有很多重复代码,甚至随着技术的发展,有更多新的实现方法和方案,那么有人就把这些实现IOC的代码打包成组件或框架,来避免人们重复造轮子。所以实现IOC的组件或者框架,我们可以叫它IOC Container。(原文地址:https://www.zhihu.com/question/32108444/answer/220819349)
什么是AOP?
AOP(Aspect Oriented Programming)面向切片编程,是OOP(Object Oriented Programming)的拓展。OOP只能保证方法的复用,但是方法中一些固定逻辑代码无法通过OOP复用,如日志代码,这种代码被成为横切逻辑代码。AOP通过代理模式(JDK Proxy、Cglib)将横切逻辑代码和业务代码分离,这个叫横切抽取机制?
写一个业务类(该类使用@Aspect
,也称切面类),类中方法可以使用注解拦截 和 指定方法拦截 两种方式
Spring AOP和AspectJ AOP的区别?
Spring AOP基于代理(Proxy),是运行时增强,AspectJ AOP基于字节码操作,是编译时增强。 Spring框架已集成Aspect AOP。两者相比,AspectJ功能更全更强大,Spring更简单。
如果项目中切面过多的话,推荐使用AspectJ AOP,速度更快。
Spring Bean
bean指代哪些被IOC容器管理的对象。
IOC容器通过配置元数据(xml、注解、Java配置类)管理Bean。org.springframework.beans
和org.springframework.contexts
是实现IoC的基础,可以看看。
Spring Bean的作用域/初始化方法?
配置方法:
<bean id="..." class="..." scope="singleton"></bean>
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
return new Person();
}
- singleton: 单例模式,懒汉、饿汉,也是默认方法。
- prototype: 每个请求都会创建一个实例。
- request: 每次请求生成一个bean实例,并且仅在http request内有效。
- session: 每个session内生成一个bean实例,仅在该http session内有效。
- glocal-session: 全局session域,仅仅在portlet的web应用中才有意义,Spring5已经移除。
- portlet是能够生成予以代码片段的小型java web插件。它们基于Portlet容器,可以像servlet一样处理http请求。但是,与servlet不同,每个portlet都有不同的会话。
单例bean的线程安全问题
存在线程安全问题。
解决方式:
- bean中避免定义可变的成员变量。
- 在类中定义一个TheadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐)
@Component和@Bean的区别
bean的声明周期
Spring事务的事务传播行为
为了解决业务层方法之间相互调用的事务行为:当事务方法调用另一种事务方法时,必须指定事务应该如何传播。
BeanFactory 和 ApplicationContext的区别
- BeanFactory
- 懒加载
- 不支持基于注解的依赖注入
- ApplicationContext
Spring Boot
SpringBoot自动装配原理
@SpringBootApplication
是由@SpringBootConfiguration
、@EnableAutoConfigurarion
和@ComponentScan
- @SpringBootConfiguration
- @Configuration
- @Component
- @Configuration
- @EnableAutoConfigurarion
- @AutoConfigurationPackage
- @Import({Registrar.class}) 使用了@Import注解,这里导入的是Registrar.class
- Register类
- public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry):扫描启动类(XXXSpringApplication)的路径极其子路径的所有组件到Spring容器。
- Register类
- @Import({Registrar.class}) 使用了@Import注解,这里导入的是Registrar.class
- @Import({AutoConfigurationImportSelector.class})
- AutoConfigurationImportSelector类
- 给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件:
- Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
- AutoConfigurationImportSelector类
- @AutoConfigurationPackage
- @ComponentScan:自动扫描并加载符合条件的Bean到容器中,这个注解会默认扫描声明类所在的包开始扫描
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 525244039@qq.com
文章标题:Spring相关知识点
文章字数:1.2k
本文作者:Zikun
发布时间:2021-08-30, 16:01:55
最后更新:2021-08-30, 16:01:55
原始链接:http://zikun97.github.io/2021/08/30/Spring%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E7%82%B9/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。