知识梳理_09_Spring、SpringMVC、SpringBoot

参考:
《JavaGuide》

https://www.bilibili.com/video/BV1Et411Y7tQ?p=67&t=303

Spring

什么是Spring框架,主要包含那些模块

在这里插入图片描述
在这里插入图片描述

IOC 控制反转(DI 依赖注入)

IoC(Inverse of Control:控制反转)是⼀种设计思想,就是 将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 IoC 容器是Spring⽤来实现 IoC 的载体, IoC 容器实际上就是个Map(key, value) ,Map 中存放的是各种对象

而在创建对象的过程中 Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入,也即DI。

依赖注入四种方式

  1. 构造器注入
/*带参数,方便利用构造器进行注入*/
public CatDaoImpl(String message){
this. message = message;
}
<bean id="CatDaoImpl" class="com.CatDaoImpl">
<constructor-arg value=" message "></constructor-arg>
</bean>
  1. setter 方法注入
public class Id {
private int id;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
}
<bean id="id" class="com.id "> <property name="id" value="123"></property> </bean>
  1. 静态工厂注入
    静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让 spring 管理所
    有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过 spring 注入的形式获
    取:
public class DaoFactory { //静态工厂
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
	}
}
public class SpringAction {
private FactoryDao staticFactoryDao; //注入对象
//注入对象的 set 方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
	}
}
//factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
<bean name="springAction" class=" SpringAction" >
<!--使用静态工厂的方法注入对象,对应下面的配置文件-->
<property name="staticFactoryDao" ref="staticFactoryDao"></property>
</bean>
<!--此处获取对象的方式是从工厂类中获取静态方法-->
<bean name="staticFactoryDao" class="DaoFactory"
factory-method="getStaticFactoryDaoImpl"></bean>
  1. 实例工厂
    实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 new 工厂类,再调用普通的
    实例方法:
public class DaoFactory { //实例工厂
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
	}
}
public class SpringAction {
private FactoryDao factoryDao; //注入对象
public void setFactoryDao(FactoryDao factoryDao) {
this.factoryDao = factoryDao;
	}
}
<bean name="springAction" class="SpringAction">
<!--使用实例工厂的方法注入对象,对应下面的配置文件-->
<property name="factoryDao" ref="factoryDao"></property>
</bean>
<!--此处获取对象的方式是从工厂类中获取实例方法-->
<bean name="daoFactory" class="com.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory"
factory-method="getFactoryDaoImpl"></bean>

五种不同方式的自动装配

Spring 装配包括手动装配和自动装配,手动装配是有基于 xml 装配、 构造方法、 setter 方法等自动装配有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。

  1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
  2. byName:通过参数名 自动装配, Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
  3. byType:通过参数类型自动装配, Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
  4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
  5. autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。

Spring初始化过程和Bean生命周期

在这里插入图片描述

循环依赖

参考:
https://mp.weixin.qq.com/s/kS0K5P4FdF3v-fiIjGIvvQ

Spring解决循环依赖是有前置条件的:

  • 出现循环依赖的Bean必须要是单例
  • 依赖注入的方式不能全是构造器注入的方式(很多博客上说,只能解决setter方法的循环依赖,这是错误的)

我们AB循环依赖问题只要A的注入方式是setter且singleton, 就不会有循环依赖问题。

@Component
public class A {
// @Autowired
// private B b;
 public A(B b) {
 }
}
@Component
public class B {
// @Autowired
// private A a;
 public B(A a){
 }
}

在这里插入图片描述

在这里插入图片描述

三级缓存

在普通的循环依赖的情况下,三级缓存没有任何作用。三级缓存实际上跟Spring中的AOP相关。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
假设不使用三级缓存,直接在二级缓存中
在这里插入图片描述
在这里插入图片描述

BeanFactory和FactoryBean区别

两者都是接口;
BeanFactory主要是用来创建Bean和获得Bean的;
FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象;
通过BeanFactory和beanName获取bean时,如果beanName不加&则获取到对应bean的实例;如果beanName加上&,则获取到FactoryBean本身的实例
FactoryBean 通常是用来创建比较复杂的bean(如创建mybatis的SqlSessionFactory很复杂),一般的bean 直接用xml配置即可,但如果创建一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean

BeanFactory 和ApplicationContext的区别

BeanFactory和ApplicationContext** 都是接口**,并且ApplicationContext 间接继承了BeanFactory。

BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和获取对象的功能,而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能。
ApplicationContext提供的额外的功能:获取Bean的详细信息(如定义、类型)、国际化的功能、统一加载资源的功能、强大的事件机制、对Web应用的支持等等。

加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反的,它是在Ioc启动时就一次性创建所有的Bean,好处是可以马上发现Spring配置文件中的错误,坏处是造成浪费。

AOP

概念

AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关, 却为业务模块所共同调⽤的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码, 降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接⼝,那么Spring AOP会使⽤JDKProxy,去创建代理对象,⽽对于没有实现接⼝的对象,就⽆法使⽤ JDK Proxy 去进⾏代理了,这时候Spring AOP会使⽤Cglib ,这时候Spring AOP会使⽤ Cglib ⽣成⼀个被代理对象的⼦类来作为代理。

执行顺序变化

测试代码:

@Aspect
@Component
public class LogAspect {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("execution(* com.cc.controller.*.*(..))")
    public void logAop() {

    }

    @Before("logAop()")
    public void logBefore() {
        logger.debug("前置通知Before");
    }

    @AfterReturning("logAop()")
    public void logAfterReturning() {
        logger.debug("返回通知AfterReturning");
    }

    @After("logAop()")
    public void logAfter() {
        logger.debug("后置通知After");
    }

    @AfterThrowing("logAop()")
    public void logAfterThrow() {
        logger.debug("异常通知AfterThrowing");
    }

    //环绕通知功能很强,可以替代上面的所有通知
    @Around("logAop()")
    public void logAround(ProceedingJoinPoint jp) {
        try {
            logger.debug("环绕通知前置通知Before");
            jp.proceed();//将控制权交给被通知的方法,也就是执行sayHello方法
            logger.debug("环绕通知返回通知AfterReturning");
        } catch (Throwable throwable) {
            logger.debug("环绕通知异常通知AfterThrowing");
            throwable.printStackTrace();
        }
        logger.debug("环绕通知后置通知After");
    }
}

在这里插入图片描述

事务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

用到的设计模式

在这里插入图片描述

SpringMVC

处理请求的流程

在这里插入图片描述

1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象Handler及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter(让Handler实现更加灵活)处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView(连接业务逻辑层和展示层的桥梁,持有一个ModelMap对象和一个View对象)。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(将ModelMap模型数据填充至视图中)。
11、DispatcherServlet响应用户

SpringBoot

启动流程,自动配置,Starter原理

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值