Spring学习分享

Spring学习分享

IOC

IOC是一种编程思想,DI依赖注入是它的一种实现方式,核心是控制反转,将容器交由第三方控制,减少代码的耦合程度,并且可以让程序员更专注与业务代码。
DI的三种注入方式,前两种用的比较多
1. 构造器注入
2. setter注入
3. 接口注入

AOP

AOP存在的意义,抽取出一些公共的业务无关的功能,通过配置,在指定位置织入这些功能。
AOP实现方式:
Cglib动态代理或者JDK动态代理
两者的区别是,如果一个bean实现了借口,就默认通过JDK动态代理的方式代理,JDK代理生成的是代理类的匿名实例,如果没有就通过Cglib动态代理,Cglib代理是通过修改字节码的方式,生成当前类的子类,性能上Cglib的性能慢一些
AOP的应用场景:
1. 事务
2. 全链路日志脱敏工具。可以通过AOP + Logback中的MDC来实现全链路日志追踪。首先写一个切面类。

Spring中的两种容器BeanFactory和ApplicationContext

BeanFactory 是IOC的基础容器,采用延迟初始化的策略,只有在某一个bean被用到的时候才会进行初始化操作。相对来说启动较快,但是功能会差一些。

ApplicationContext 是在BeanFactory的基础上创建的,拥有BeanFactory的所有功能,ApplicationContext在启动时就会初始化所有的bean,并提供更为复杂的功能比如事件发布,国际化等功能。Application相对来说占用的资源也会更多。

Spring管理bean的方式

在Spring中,管理bean主要是通过xml的方式和注解的方式,通过xml的方式相对来说比较复杂,因此大多数是通过注解的方式来管理bean的。
主要管理bean的注解有

  1. @ComponentScan:扫描一个包下面的所有bean
  2. @Component、@Controller、@Service、@Repository,把一个类声明为一个组件
  3. @Autowired、@Qualify,自动注入
  4. @Scope,声明bean的作用域
    • 单例sington:只有这一个
    • 原型:用到的时候新生成一个
    • session:一个会话中只有一个
    • request:一个请求中只有一个
    • golablSession:同一个全局的session共享一个

Spring是如何解决循环依赖的问题的

循环依赖分为三种情况

  1. 构造器循环依赖(无法解决)
  2. 非单例循环依赖(无法解决)
  3. 单例setter循环依赖,通过三级缓存解决
    Spring的三级缓存分为
  4. 第一级缓存:装了已经创建好,并且初始化完成的对象
  5. 第二级缓存:装了已经创建好,但是未初始化的对象
  6. 第三级缓存:装了还未创建好,位于创建阶段的对象。
    通过三级缓存来解决循环依赖,假设A依赖B,B依赖A。那么在创建A的时候,A首先进入创建阶段,在三级缓存内注册自身,然后初始化时发现依赖B,而B还未被初始化,此时开始初始化B,而B在第三级缓存中找到A,完成自身初始化,同时让A完成初始化

Spring中提供的单例Bean是线程安全的吗

要分阶段讨论,首先,如果这个bean是一个无状态的bean,也就是说,这个bean是一个Service、DAO这样的,除了调用不会对bean本身产生影响的,就是一个线程安全的bean。如果是一个有状态的服务,想让其线程安全,可以是用ThreadLocal,针对每一个线程创建一个独属于副本本身的bean。

Spring事务

Spring的事务分为:编程性事务、声明性事务。
编程性事务比较麻烦,直接在代码中加入和事务相关的代码,但是更加灵活。
声明性事务比较简洁,是Spring的亮点,只要配置好相对应的规则,配合@Transcational注解即可完成。
事务的传播规则:
当内部调用方法的时候,可能彼此之间都有事务,如何控制达到语气的结果就是事务传播规则。
有七种事务传播规则

  1. Propogation_Required:如果当前没有事务就创建事务,如果有事务就加入
    事务的隔离性:可以通过配置Isolution来配置

Bean的生命周期

bean的生命周期可以简单分为四步

  1. 实例化
  2. 注入属性
  3. 初始化
  4. 销毁
    容器级别的扩展点
    BeanPostProcessor
    实例级别的扩展点
    BeanNameAware 可以修改bean的名称
    注意如果是原型prototype,这最后的生命周期交给用户管理

SpringBoot的注解

@SpringApplication
@SpringApplication = @ComponentScan + @SpringBootApplication + @EnableAutoConfiguration

@ComponentScan主要是扫描某一个路径,把这个路径下的组件(比如@Component、@Serivce、@Configuration等等)注册到容器中
@SpringBootApplication,声明当前类是一个Configuration,配置类。

@EnableAutoConfiguration,这个注解是一个核心注解,代表着SpringBoot的自动装配

@Import(AutoConfigurationImportSelector.class)

引入了AutoConfigurationImportSelector,可以帮助应用把所有符合条件的Configuration都引入IOC容器。首先回去加载spring-boot-autoconfigure下面的spring.facoties下制定的xxAutoConfigure.class,然后根据这些类加载进入都是由指定条件的,由@Conditional配置,如果符合条件,就把这个bean引入至IOC容器。

SpringBoot的启动流程

SpringBoot的启动流程大致上分为两块

  1. 实例化初始化Application类,在这个阶段会配置一些构造器,监听器,环境变量等信息
  2. 执行run方法
    1. 创建监听器,和计时器
    2. 配置Args传入的变量
    3. 初始化容器
    4. 监听器发布finish时间,计时器终止
    5. 发布就绪时间,表明SpringBoot启动完毕。

Spring与SpringBoot 重要注解

  1. @SpringBootApplication = @ComponentScan + @EnableAutoConfiguration + @SpringBootConfiguration。
    • ComponentScan:扫描对应包生成对应的bean
    • EnableAutoConfiguration:开启SpringBoot的自动配置。(同时也会注入一些组件)
    • SpringConfiguration:本质上是一个Configuration配置类。而Configuration类搭配@Bean将bean交由Spring管理。
  2. Spring的自动配置:Spring的自动配置主要靠xml中显示配置,开启注解之后可以使用:
    • @Autowire:byType注入
    • @Resource:byName注入
    • @Quliafy:搭配@Autowire使用,指定一个bean
  3. @RestController = @Controller + @ResponseBody
    • @ResponseBody:不走视图解析器了,直接把接受到的数据打印出来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值