Spring

Spring框架的核心在于控制反转(IoC)和依赖注入(DI)。

一、Spring的核心原理

  1. 控制反转(IoC)

控制反转是Spring框架的核心概念之一。在传统的Java应用中,对象的创建和依赖关系往往由开发者手动编写,这在大型应用中会导致代码繁杂且难以维护。Spring的IoC容器通过自动管理对象的创建和依赖注入,极大地简化了开发流程。

  • 依赖注入(DI):Spring通过构造函数、setter方法或者字段注入的方式,自动将依赖关系注入到对象中。

  • Bean定义:在Spring中,所有的对象都被视为Bean,通过配置文件或者注解来定义Bean及其属性。
    **- IOC容器bean生命周期:
    1.实例化(Instantiation):IOC容器通过反射或者克隆等方式创建Bean的实例。

    2.依赖注入(Dependency Injection):IOC容器设置Bean的依赖关系,即注入所需的属性或依赖。

    3.初始化(Initialization):如果Bean实现了BeanNameAware, BeanFactoryAware, ApplicationContextAware等接口,IOC容器会调用这些接口的方法。

    4.调用预处理器(Post-Processors):如果有Bean后处理器,它们会在初始化之前被调用。

    5.执行初始化方法(Initialization callback):如果Bean实现了InitializingBean接口,其afterPropertiesSet方法会被调用。

    6.调用自定义的初始化方法:如果在配置文件中定义了init-method属性,指定的方法会被调用。

    7.使用Bean(In use by application):Bean现在可以被应用程序使用了。

    8.销毁(Destruction):当容器关闭时,如果Bean实现了DisposableBean接口,其destroy方法会被调用。

  1. 面向切面编程(AOP)

AOP是Spring框架的另一个关键特性,它允许开发者在不修改源代码的情况下,对程序进行横向切割,以实现功能的增强。
Spring AOP 的原理

Spring AOP 的核心原理是通过动态代理机制实现的。当应用启动时,Spring 容器会自动为匹配的 bean 创建代理对象。这些代理对象在运行时对方法调用进行拦截,并插入相应的增强代码。

  • JDK 动态代理:如果目标类实现了至少一个接口,Spring AOP 使用 JDK 提供的 Proxy 类和 InvocationHandler 接口来创建代理。
  • CGLIB 代理:如果目标类没有实现任何接口,Spring AOP 使用 CGLIB 库来创建代理。

这两种代理方式在运行时都能够动态地为方法调用添加额外的行为。

  • 切面(Aspect):它定义了切点(Pointcut)和通知(Advice),用于指定在哪些方法上应用增强功能。
  • 切点表达式:通过表达式来指定哪些方法将被拦截。
  • 通知类型:包括前置通知、后置通知、环绕通知等,以实现不同类型的方法增强。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class AuthorizationAspect {

    @Pointcut("execution(* com.it.controller.*.*(..))")
    public void controllerMethods() {
        // 切点定义
    }

    @Before("controllerMethods()")
    public void validateAuthorizationHeader() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            String authorizationHeader = request.getHeader("Authorization");
            if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
                throw new RuntimeException("Invalid or missing Authorization header");
            }

        }
    }
}

二、Spring框架的主要模块

Spring框架包含了多个模块,每个模块都专注于不同的功能领域。

  • Spring Core:提供了基础的功能,包括IoC和AOP。
  • Spring Data:简化了数据访问层的开发,支持多种数据源。
  • Spring MVC:用于构建Web应用程序,提供了请求映射、视图解析等功能。
  • Spring Boot:自动化配置和部署,使得创建独立运行的Spring应用更加便捷。
  • Spring Cloud:用于构建分布式系统,包括服务发现、配置中心、负载均衡等。

Spring中事务管理支持哪几种方式**

编程式事务管理
编程式事务管理允许开发者通过编码的方式手动控制事务的边界,提供了两种方式:

  1. 使用TransactionTemplate

声明式事务管理
声明式事务管理允许开发者通过声明的方式管理事务,无需编写事务管理的代码,支持以下几种方式:

  1. 使用@Transactional注解
    通过在方法或类上添加@Transactional注解来声明事务边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值