学习笔记-Spring

目录

Srping七大模块

Spring 干嘛的?

Spring主要模块

1、重要的Spring模块

IoC和DI

IOC 实现过程

容器启动阶段

Ioc和DI的区别

IOC好处

BeanFactory 和 ApplicationContext 区别?

AOP(Aspect-Oriented Programming:面向切面编程)

aspect(切面):

springboot如何用AOP

2、Spring bean

什么是Spring bean?

Srping Bean 的生命周期

对spring进行定制化功能扩展时,可以选择如下一些扩展点:

Spring Bean 的作用域

双亲委模式

3、Spring事务

3.1、Spring 事务中的隔离级别有哪几种?

3.2、Spring 事务中哪几种事务传播行为?

4、SpringMVC

5、Spring 框架中用到了哪些设计模式?

7、Spring常用注解

@Component和@Bean区别

@Autowired和@Resource区别

Srping七大模块

Spring 干嘛的?

Spring是J2EE轻量级开源框架,最大的两个特性IoC和AOP,如果是三大特性就是:IOC 、AOP、DI。

Spring主要模块

spring core:最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。核心容器的主要组件是 BeanFactory,它是工厂模式的实现

spring context: 核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。

Spring AOP:面向切面编程

spring DAO: 事务和异常

spring ORM:包括Hibernate、JDO和iBATIS SQL映射

spring web:

spring web mvc:

1、重要的Spring模块

Spring IOC 容器源码分析_Javadoop

IoC和DI

IoC(Inverse of Control:控制反转),DI:  Dependency Injection  依赖注入

将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后

注入到A类中。就是控制反转。这里的DI也就是依赖注入,就是实现控制反转的方式。IOC可以解决对象耦合的问题,有利于功能的复用。所有bean统一放在一个叫做context的上下文中进行管理。

PS:Java反射机制在Spring IOC中的应用_小草的博客-CSDN博客_spring 反射

IOC 实现过程

Spring IOC容器在实现分为两个主要部分:
其一 :容器启动阶段:在容器的启动阶段主要做的是一些信息收集的过程(主要依赖于工具类BeanDefinitionReader),将收集的信息组成BeanDefinition.将BeanDefinition注册到相应的BeaneanRegistry.
其二:bean实例化阶段。通过getBean取出class.进行实例化
在这里插入图片描述

容器启动阶段

ApplicationContext继承关系如下图:

AbstractApplicationContext中的refresh()源码如下图。

1

 refresh() 方法源码:

通过createBeanFactory构建了一个IoC容器供ApplicationContext使用

启动loadBeanDefinitions来载入BeanDefinition

public void refresh() throws BeansException, IllegalStateException {
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var9) {
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }

                this.destroyBeans();
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }

        }
    }

Ioc和DI的区别

IoC主要的实现方式有两种:依赖查找,依赖注入DI;DI太过主流了,所以容易混了。

IOC好处

1、解耦

2、容器提供众多的辅佐类,使这些类可以加快应用的开发.如jdbcTemplate HibernateTemplate

3、容器提供单例模式支持,开发人员不需要自己编写实现代码

4、容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

BeanFactory 和 ApplicationContext 区别?

他们有生成bean的能力,ApplicationContext 可以指定config,但是beanFactory只负责生成bean.

AOP(Aspect-Oriented Programming:面向切面编程)

能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

aspect(切面):

切入点+通知

一、通知(Advice)说明了干什么的内容(即方法体代码)和什么时候干(什么时候通过方法名中的before,after,around等就能知道),

二、切入点说明了在哪干(指定到底是哪个方法),切点表达式等定义。

A代理对象,会有一个属性时A原对象。执行A代理对象执行某个方法,然后也会执行A原对象的这个方法。

springboot如何用AOP

1、不需要@EnableAspectJAutoProxy来启用,springboot是默认开启的,只需要引用jar包

2、类上加@Aspect @Component,方法@Pointcut("execution(public * com.example.aop..*.*(..))")定义切入点,然通过@Before("webLog()") 等。

3、通知:@Before(value = POINT_CUT)  public void before(JoinPoint joinPoint){

2、Spring bean

什么是Spring bean?

Bean是JAVA 持久化的类对象!

Srping Bean 的生命周期

简单点说就是:bean的实例化–>bean的初始化–>bean的使用–>bean的销毁

spring扩展

1.BeanFactoryPostProcessor

是beanFactory后置处理器,支持在bean factory标准初始化完成后,对bean factory进行一些额外处理。在讲context初始化流程时介绍过,这时所有的bean的描述信息已经加载完毕,但是还没有进行bean初始化。例如前面提到的PropertyPlaceholderConfigurer,就是在这个扩展点上对bean属性中的占位符进行替换。

2.BeanDefinitionRegistryPostProcessor

它扩展自BeanFactoryPostProcessor,在执行BeanFactoryPostProcessor的功能前,提供了可以添加bean definition的能力,允许在初始化一般bean前,注册额外的bean。例如可以在这里根据bean的scope创建一个新的代理bean。

3.BeanPostProcessor

提供了在bean初始化之前和之后插入自定义逻辑的能力。与BeanFactoryPostProcessor的区别是处理的对象不同,BeanFactoryPostProcessor是对beanfactory进行处理,BeanPostProcessor是对bean进行处理。

注:上面这三个扩展点,可以通过实现Ordered和PriorityOrdered接口来指定执行顺序。实现PriorityOrdered接口的processor会先于实现Ordered接口的执行。

4.ApplicationContextAware

可以获得ApplicationContext及其中的bean,当需要在代码中动态获取bean时,可以通过实现这个接口来实现。

5.InitializingBean

可以在bean初始化完成,所有属性设置完成后执行特定逻辑,例如对自动装配对属性进行验证等等。

6.DisposableBean

用于在bean被销毁前执行特定的逻辑,例如做一些回收工作等。

7.ApplicationListener

用来监听spring的标准应用事件或者自定义事件。

Spring Bean 的作用域

singleton作用域 : 是spring默认的作用域,bean 在每个 Spring ioc 容器中只有一个实例。

prototype作用域(原型):一个 bean 的定义可以有多个实例,但该作用域谨慎使用,频繁创建和销毁会严重影响性能。

request作用域:每次 http 请求都会创建一个 bean, 该作用域仅在基于 web 的 Spring Application Context 情况下有效。

session作用域:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring Application Context 情况下有效 。

global-session作用域:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring Application Context 情况下有效

在Spring源码BeanDefinition 中,只有默认Singleton  和 prototype

双亲委模式

一个类加载器收到了类加载请求,不会自己立刻尝试加载类,而是把请求委托给父加载器去完成

Spring 三级缓存

一级缓存

单例池singletonObjects:是Map.Spring Bean初始化后会将完整的Bean对象放入单例池中。

二级缓存

earlySingletonObjects:是Map,是未完成那些出现循环依赖生命周期的对象

三级缓存

singletonFacotries::是Map,为了打破循环依赖,保存的对象

3、Spring事务

数据库的隔离机制,而spring实现的是传播机制

3.1、Spring 事务中的隔离级别有哪几种?

TransactionDefinition 接口中定义了五个表示隔离级别的常量:

TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别   Oracle 默认采用的 READ_COMMITTED隔离级别.

TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

但是这将严重影响程序的性能。通常情况下也不会用到该级别。

3.2、Spring 事务中哪几种事务传播行为?

支持当前事务的情况:

TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况:

TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:

TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

4、SpringMVC

5、Spring 框架中用到了哪些设计模式?

来源:Spring中使用的设计模式_思凡-CSDN博客_spring中使用设计模式

工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。

代理设计模式 : Spring AOP 功能的实现。

单例设计模式 : Spring 中的 Bean 默认都是单例的。

模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

7、Spring常用注解

@Component和@Bean区别

  • @Component注解在类上使用表明这个类是个组件类,需要Spring为这个类创建bean。
  • @Bean注解使用在方法上,告诉Spring这个方法将会返回一个Bean对象,需要把返回的对象注册到Spring的应用上下文中。

@Autowired和@Resource区别

如果问推荐哪个,回答Resource,因为Resource是JAVA提供的,Spring更高层。如果换个框架,就不适用,而java是标准

spring中@Autowired注解,是用来自动装配对象的,默认下按照类型(By Type)、自动(Required)装配

@Resource JSR-250提供的(javax.annotation.Resource),java标准。

1、@Resource("name1") 通过name1去找,没有报错

2、@Resource 默认通过名字去Map里找,没有再用Type去找,唯一则返回,如果多个也会报错。

@resource流程: 

@Qualifier和@Primary标签

@Primary 同名,优先级高

public interface IUser {
    void say();
}

@Service
public class User1 implements IUser{
    @Override
    public void say() {
    }
}

@Service
public class User2 implements IUser{
    @Override
    public void say() {
    }
}

@Service
public class UserService {

    @Autowired
    private IUser user;
}

preview

解决方案:

@Service
public class UserService {

    @Autowired
    @Qualifier("user1")
    private IUser user;
}

问题

1、@configuration 区别? 

和@Bean和@Component区别,虽然他们都会注册成BeanDefinition,但是只有@Configuration会被标记FULL,创建CGLIB动态代理,A调用B,C调用B,B会先从IOC容器中拿,有的话就不创建,保证了单例

2、接口类会被扫描进IOC容器吗?

正常情况下Spring不会。

除非加上lookup标签,例如Mybatis的Mapper,框架中重写 isCandidateComponet

1、不同版本的 Spring Framework 有哪些主要功能?

2、什么是 Spring Framework?

3、列举 Spring Framework 的优点。

4、Spring Framework 有哪些不同的功能?

5、Spring Framework 中有多少个模块,它们分别是什么?

6、什么是 Spring 配置文件?

7、Spring 应用程序有哪些不同组件?

8、使用 Spring 有哪些方式?

9、什么是 Spring IOC 容器?

10、什么是依赖注入?

11、可以通过多少种方式完成依赖注入?

12、区分构造函数注入和 setter 注入。

13、spring 中有多少种 IOC 容器?

14、区分 BeanFactory 和 ApplicationContext。

15、列举 IoC 的一些好处。

16、Spring IoC 的实现机制。

17、什么是 spring bean?

18、spring 提供了哪些配置方式?

19、spring 支持集中 bean scope?

20、spring bean 容器的生命周期是什么样的?

21、什么是 spring 的内部 bean?

22、什么是 spring 装配’

23、自动装配有哪些方式?

24、自动装配有什么局限?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值