Spring初探(一)Spring MVC工作原理、AOP、Bean

341 阅读3分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

Spring

是什么

Spring是一种轻量级的开发框架。为了提高开发人员的开发效率以及系统的可维护性。

Spring框架是多模块的集合。

优点:

  • 开源免费框架
  • 轻量级、非入侵的(不会影响其他模块)
  • 控制反转(IoC)(低耦合) 、面向切面(AOP)
  • 事务处理,对框架的整合处理

Spring是一个轻量级控制反转(IoC)、面向切面的开源框架

什么是侵入式

侵入式:会改变java类结构

非侵入式:对现有的类结构没有影响

七大模块

  • Spring Boot

    • 是一个快速开发的脚手架
    • 可以使用SpingBoot快速开发单个微服务
    • 约定大于配置
  • Spring Cloud

    • 基于Spring Boot实现的

IoC

是一种设计思想。将原来由程序手动创建对象的控制权,交给Spring框架管理。

IoC容器是Spring实现IoC的载体。(IoC容器就是Map)

开发人员不用去管理对象的创建,专注于业务的开发。降低系统的耦合性。

DI(依赖注入)是实现Ioc的一种方式。

依赖倒置原则(Dependency Inversion Principle)

下层依赖上层。

AOP

面向切面编程。将与业务无关的,但是与业务模块无法分离的,如日志、事务、权限等封装起来。减少系统重复的代码,降低耦合性,提高系统的可维护性、可拓展性。

Spring AOP就是基于动态代理的。

Spring AOP和AspectJ AOP的区别

Spring AOP运行时增强,基于代理。

AspectJ AOP编译时增强,基于字节码。

Spring AOP集成了AspectJ(复杂,切面多的话,效率更高)。

Spring AOP:简单、易上手

AspectJ:复杂,切面多的话,效率更高

切面少,两者性能差不多。

IoC创建对象

  1. 基于 XML 的配置元数据

    • 默认使用无参构造函数

    • 使用有参构造函数

      • 下标赋值

        <bean id="User" class="com.lkk.entity.User">
            <constructor-arg name="name" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
        </bean>
        
      • 类型(不建议使用)

        <bean id="User" class="com.lkk.entity.User">
            <constructor-arg type="java.lang.String" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
        </bean>
        
      • 参数名

        <bean id="User" class="com.lkk.entity.User">
            <constructor-arg index="0" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
        </bean>
        

Spring配置

别名

<bean id="User" class="com.lkk.entity.User">
    <constructor-arg type="java.lang.String" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
</bean>
​
<alias name="User" alias="user"></alias>

Bean的配置

<bean id="User" class="com.lkk.entity.User" name="user1,user2">
    <constructor-arg name="name" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
</bean>

import

<import resource="bean.xml"></import>
<import resource="bean2.xml"></import>

Spring Bean

bean的作用域

作用域说明
singleton(默认)唯一bean实例
prototype每次请求都会出创建一个实例
request每次HTTP请求产生一个新的bean,仅在当前HTTP request内有效
session每次HTTP请求产生一个新的bean,仅在当前HTTP session内有效
application
websocket

单例bean的线程安全问题

常用的 ControllerServiceDao 这些 bean 是无状态的。

无状态的 bean 不能保存数据,因此是线程安全的。

解决方式:

  • ThreadLocal 成员变量,将可变的成员变量保存在ThreadLocal中
  • 改变bean的作用域为prototype

@Component和@Bean的区别

  • 作用对象:@Component作用在上;@Bean作用在方法上。

  • @Component:通常是类路径扫描(@ComponentScan)来自动装配至Spring容器

    @Bean:在标有@Bean注解的方法中定义bean

  • @Bean的自定义更强,某些特定情况只能使用@Bean。

将类声明为Spring的bean

可以通过@Autowired自动装配bean。类应该怎样让@Autowired识别到呢?

@Repository

@Service

@Controller

@Component

bean的生命周期

Spring MVC

MVC是一种设计模式,Spring MVC是一种MVC框架,

Spring MVC工作原理时序图

image-20210701145459422.png

Spring用到了哪些设计模式?

  • 代理设计模式
  • 工厂设计模式
  • 单例设计模式
  • 模板方法模式
  • 包装器设计模式
  • 观察者模式
  • 适配器模式