xiaoWang3486

博客园 首页 新随笔 联系 订阅 管理

1.Spring使用到的设计模式

工厂模式:BeanFactory生产Bean就使用的工厂设计模式

单例模式:生产出来的Bean就是单例模式

代理模式:CGLiB和JDK对AOP进行代理时就是大力模式

2.IoC

**作用:**全称叫控制反转,本意就是,讲原始的主动创建对象和装配的过程,交给容器来管理,实现控制权反转。底层采用工厂加反射来实现的。工厂负责提供getBean方法,反射通过getBean传参来对类进行反射创建对象。

**好处:**将复杂的管理对象的操作交给容器,程序员能更专注的关注业务逻辑。减少代码量。

3.DI

作用:将Spring容器管理的对象,注入到需要使用的类中,此类只需要提供对应的对象和setter方法即可。

IoC和DI的区别

IoC是负责控制管理对象的,而DI则是需要使用对象时负责注入的动作。	

AOP是什么

AOP全程是面向切面变成,本质是当我们需要做一些与业务逻辑无关的行为时,可以将这写公共代码抽取出来到一个模块中。使用动态代理的方式在运行阶段对代码进行增强操作,并且是非侵入式的,只需在切面中配置需要增强的对象即可。

AOP名词

切面:抽取出来的切面类

通知:增强的代码逻辑

切点:配置需要增强的方法

连接点:被增强的方法

AspactJ和AOP

AOP是使用动态代理的方式,当有接口时会使用JDK,没有接口时会使用CGLIB代理。

AspactJ是通过编译阶段,修改字节码文件来实现切入。

CGLIB和JDK

CGLIB比JDK慢,老版本快。

JDK:只能对接口进行代理,不能对类代理。当目标方法被调用时,就会去生成的代理类文件中调用对应的方法,随后会去切面中执行相应的逻辑,再通过反射机制调用目标方法实现增强。

CGLIB:通过继承父类的方式来实现代理,如果该类用final修饰,就不能实现代理。当调用时直接使用子类调用父类即可。

事务的声明:

1.接口的方式,AOP。

2.基于xml

3.基于注解

事务的传播

1.required 有就加入,没有就新建

2.required-new 有没有都创建新的

3.support 有就融入,没有就不

4.not support 不创建也不融入

多线程事务一致性

事务只对单独线程起作用,事务的信息存储在线程的ThreadLocal中,一个线程只能有一个事务。

为了实现一致性,可以给每个线程设置中间变量供所有线程轮询,当有线程异常时,其他线程回滚。

Spring的设计模式

简单工厂,单例模式,代理模式,观察者模式

Spring启动过程

  1. 读取web.xml文件。
  2. 创建 ServletContext,为 ioc 容器提供宿主环境。
  3. 触发容器初始化事件,调用 contextLoaderListener.contextInitialized()方法,在这个方法会初始化一个应用上下文WebApplicationContext,即 Spring 的 ioc 容器。ioc 容器初始化完成之后,会被存储到 ServletContext 中。
  4. 初始化web.xml中配置的Servlet。如DispatcherServlet,用于匹配、处理每个servlet请求。

5.单例池

Spring默认是单例模式,单例池存储的是单例对象。

Bean和对象的区别

程序自己创建的对象叫对象,由Spring的IoC管理创建的是Bean

初始化和实例化

初始化:加载类时给类的静态资源分配空间和赋值

实例化:在堆区分配空间,创建对象给对象的成员变量赋值

先ByType再ByName

在对对象进项注入是,会先通过属性进行查找,找到多个时,再根据属性名进行查找

BeanFactory和ApplicationContext

ApplicationContext继承了BeanFactory,所以实现BeanFactory的方法,主要作为容器使用,还提供了许多扩展功能,包括自动注册Bean,国际化,监听等等,BeanFactory之是作为生产Bean使用。

BeanDefinition作用

负责在容器创建时,将Bean的配置元数据信息加载到BeanDefinition对象中

BeanFactory和FactoryBean的区别

FactoryBean还是由BeanFactory管理,但是当Bean实现了FactoryBean接口之后,就使用工厂模式,由FactoryBean的getObject()方法来实例化bean

image-20230810165459064

    @Override
    public Object getObject() throws Exception {
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

Spring的IoC加载过程

首先需要对xml里的文件进行扫描,并存储到一个个BeanDefinition里面,并把实例化好的BeanDefinitaion装进Map里,当操作完成后,在进行是否需要属性注入,如果需要注入,则进行属性注入。最后如果bean实例为单例的,就put进单例池中,由spring管理

image-20230810165345864

image-20230810165352199

image-20230810165357103

扩展点

Spring提供了BeanDefinition阶段扩展点,程序员自己实例化BeanDefinition。

还有BeanFactory的扩展点,可以通过这个扩展点,拿到BeanFactory去实现很多操作。

还有实例化阶段的Aware方法,实现BeanNameAware,BeanFactoryAware等等

配置bean的方式

xml,@Compent注解,JavaConfig注解里的@Bean,@import

Spring的bean的作用域

单例,多例,request,session,application

CGLib和JDK

单例bean的优势

1.提高性能,减少内存浪费

2.效率高,每次使用bean直接从单例池中拿,不用等待。

3.减少JVM垃圾回收,每次请求不会生成新的bean实例。

Controller也是bean也是单例的

单例bean线程不安全

单例是不安全的,大多是因为成员变量读写问题,只要声明在方法里就可以解决问题。其他方法:设置为多例。将成员变量放在threadLocal中。使用同步锁。

实例化bean

反射机制,@bean注解,factory-method,@bean方法,FactoryBean的方式。

bean的自动装配方式

默认为不自动装配,byName,ByType,constructor,aotodecete

Bean的三级缓存

一级缓存存储完整的Bean实例

二级缓存存储的是属性未附值的Bean实例

三级缓存存储的bean工厂

数。

解决循环依赖

循环依赖分为直接依赖和间接依赖

解决:当实例化A时,会在实例化之后,将BeanA加入到三级缓存,BeanA在属性注入阶段需要注入B时,会尝试注入B实例,在缓存中未找到,于是就会去创建B实例,在B实例过程中需要A实例,就会去一级缓存中找,如果没有就回去二三级中找,直到找到就返回。

Bean生命周期

实例化阶段:通过反射机制取创建Bean对象

属性注入阶段:通过DI对对象的属性进行依赖注入

初始化阶段:执行各种回调函数,通过实现这些回调函数,可以在实例化阶段完成很多操作。

销毁阶段:如果添加的Distory注解,可以在bean销毁时执行函

@AuroWared和@Respurces区别

@AuroWared是Spring提供,现根据类型,再根据名字

@Respurces是JDK提供的,先名称再类型

SpringMVC

执行流程

1.用户发起请求

2.被DispatcherServlet拦截,并转发到HandleMapping

3.HandleMapping接收到请求后并解析请求找到对应的Controller并返回一个执行链。

4.再调用处理方法之后,返回一个ModelAndView。

5.再由视图解析器来返回view给前端进行渲染。

posted on 2023-09-25 14:35  xiaoWang3486  阅读(17)  评论(0)    收藏  举报