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.beansorg.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
  • @EnableAutoConfigurarion
    • @AutoConfigurationPackage
      • @Import({Registrar.class}) 使用了@Import注解,这里导入的是Registrar.class
        • Register类
          • public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry):扫描启动类(XXXSpringApplication)的路径极其子路径的所有组件到Spring容器。
    • @Import({AutoConfigurationImportSelector.class})
      • AutoConfigurationImportSelector类
        • 给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件:
        • Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
  • @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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏