目录
Spring框架的核心内容分为三个部分
分别是SpringIoC容器、SpringAop面向切面编程、SpringTx事务。以下将分别介绍对应的核心内容的相关知识。
一、SpringIoC
1.1认识SpringIoC容器
原文:认识SpringIOC容器_Alphamilk的博客-CSDN博客
核心内容:
一、Spring Framework
- Spring Framework是一个开源的应用程序框架,由SpringSource公司开发,最初是为了解决企业级开发中的常见问题而创建的。它提供了丰富的功能,如依赖注入(DI)、面向切面编程(AOP)、声明式事务管理等,使得企业级应用程序的开发变得更加简单和快速。
- Spring Framework是Spring大家族中的基础实现,包括Spring Cloud、Spring MVC等技术都是建立在Spring Framework之上的。
- Spring Framework具有丰富的生态,模块化设计以及简化Java开发的优势。它不断创新和发展,引入新的特性和功能,满足不同场景下的需求。
二、Spring IOC容器
- Spring IOC容器是一种复杂容器,能够管理组件之间的依赖关系,并负责创建和销毁组件。与普通容器相比,它具有更多的功能和特性。
- 组件是能够重用的对象,比如在三层框架中,可以将三层架构拆分成三个组件。
- Spring管理组件的优势包括降低组件之间的耦合性、提高代码的可重用性和可维护性,方便配置和管理,并提供其他功能如AOP、事务管理等。
- SpringIOC容器的核心接口包括BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的扩展,提供了更多高级功能和特性。
- ApplicationContext有四个具体实现类,分别适用于不同的场景和配置方式,如ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext和WebApplicationContext。
三、Spring IOC的核心功能
- Spring的核心功能是Spring IOC(控制反转)和DI(依赖注入)。
- 控制反转(IOC)是指将对象的创建和调用控制权从应用程序转移到容器中,由容器负责创建和管理对象,并通过依赖注入的方式将对象的依赖关系注入到应用程序中。
- 依赖注入(DI)是在组件之间传递依赖关系的过程中,将依赖关系的处理交给容器来完成,避免在应用程序代码中硬编码对象之间的依赖关系,实现对象之间的解耦。
- 依赖注入可以通过构造函数注入、Setter方法注入和接口注入三种形式实现,通过注解或XML配置文件进行配置。
- Spring的IOC容器和DI功能使得组件的管理和配置更加灵活、可重用和可维护,提高了代码的可测试性和可扩展性。
1.2基于xml配置SpringIoC容器
原文:基于XML实现SpringIoC配置_Alphamilk的博客-CSDN博客
核心
一、基于XML配置Spring IOC:
- 配置Spring IOC的jar包依赖。
- 编写XML配置文件,定义<bean>标签来表示组件,并配置组件的id和class属性。
- 实现组件的创建,包括无参构造方式创建、静态工厂创建和非静态工厂创建。
二、基于XML配置DI(依赖注入):
-
基于构造函数的DI,通过容器调用具有多个参数的构造函数来完成,可以使用单参数构造方法或多参数构造方法。
- 单参数构造方法:在XML配置中使用<constructor-arg ref="..." />来指定注入的对象。
- 多参数构造方法:在XML配置中使用<constructor-arg name="..." value="..." ref="..." />来指定注入的参数。
-
基于setter函数的DI,通过容器调用组件的setter方法来完成,可以使用<property name="..." value="..." ref="..." />来指定注入的属性值或引用。
三、创建ioc容器并获取组件
-
创建IoC容器:
- 可以使用
ApplicationContext
接口的实现类,如ClassPathXmlApplicationContext
,通过指定配置文件来创建容器对象。 - 也可以先创建
ApplicationContext
的子类对象,再设置配置文件路径,并调用refresh()
方法刷新容器。
- 可以使用
-
通过容器获取组件的三种方式:
- 第一种方式:使用
getBean()
方法和组件的ID获取组件,返回一个Object
类型的对象,然后将其转换为对应的类型。 - 第二种方式:使用
getBean()
方法同时指定组件的类型作为参数,直接返回对应的类型。 - 第三种方式:根据组件的类型直接获取组件,无需指定组件的ID。
- 第一种方式:使用
1.3基于xml配置下Bean的生命周期和作用域
原文:SpringIoC组件的高级特性_Alphamilk的博客-CSDN博客
一、Bean的生命周期
- 生命周期 在对应的JavaBean类中创建相应的无参方法,并在配置<bean>标签中添加init-method和destroy-method属性。
示例:<bean id="beanId" class="com.example.BeanClass" init-method="initMethod" destroy-method="destroyMethod"/>
二、Bean的作用域
- 作用域 首先介绍两种作用域:单例模式和多例模式。
- 单例模式(Singleton) - 默认 指的是在配置<bean>标签后,通过获取组件时只会获取到同一个对象。容器只会创建一个唯一的bean对象,不会再新建对象。
示例:<bean id="beanId" class="com.example.BeanClass" scope="singleton"/>
- 多例模式(Prototype) 在多例模式下,配置一个<bean>组件后,每次获取该组件时,容器都会创建一个新的对象。
示例:<bean id="beanId" class="com.example.BeanClass" scope="prototype"/>
1.4 基于xml与注解配置SpringIoC容器
原文:SpringIoC基于注解配置_Alphamilk的博客-CSDN博客
一、注解方式和扫描(IoC)
- 注解方式是使用特定的注解来标记组件,例如@Component、@Repository、@Service、@Controller。
- 扫描是指Spring容器自动扫描指定包下的组件,并将其实例化和管理起来。
二、配置文件介绍
- 配置文件可以用于指定组件扫描的包,可以包含或排除特定的注解。
- 普通配置可以直接指定要扫描的包。
- 包含注解的配置可以指定包,并只扫描指定注解的组件。
- 排除注解的配置可以指定包,并排除特定注解的组件。
- 组件Bean的名称可以通过指定name属性来设置。
三、组件作用域和周期方法注解
- 周期方法是在组件创建、销毁、初始化等不同生命周期阶段执行的方法。
- 可以使用@PostConstruct注解在组件创建后执行初始化方法。
- 可以使用@PreDestroy注解在组件销毁前执行清理方法。
- Bean的作用域可以通过@Scope注解进行配置。
四、引用类型自动装配(DI)
- 自动装配是指Spring容器自动将依赖注入到组件中。
- 自动装配可以根据类型进行匹配,将符合类型的对象注入到组件中。
- 自动装配的三种场景分别是byName、byType和构造函数自动装配。
五、基本类型属性赋值(DI)
- 可以直接通过属性赋值来设置组件的基本类型属性。
- 也可以使用@Value注解来进行属性赋值。
1.5 基于完全注解类配置SpringIoc容器
原文:基于配置类方式管理 Bean_Alphamilk的博客-CSDN博客
一、完全注解开发理解:
- 完全注解配置是通过Java配置类和注解来替代XML配置文件。
- 完全注解配置具有更强的类型安全性和可读性。
二、配置类和扫描注解:
- 使用@Configuration标记一个类为配置类,用来定义Spring Bean和配置其他组件。
- @PropertySource用于将外部属性文件加载到Spring环境中。
- @ComponentScan用于指定要扫描的基础包,并将其下的类注册为Spring Bean。
三、通过AnnotationConfigApplicationContext创建IoC容器的两种方式:
- 直接创建AnnotationConfigApplicationContext并导入配置类。
- 创建AnnotationConfigApplicationContext实例后,调用register方法注册配置类。
四、@Bean定义组件:
- @Bean用于声明一个方法生成一个由Spring管理的Bean。
- 可以通过name/value属性指定Bean的名称。
- 可以通过initMethod和destroyMethod属性指定Bean的自定义初始化和销毁方法。
五、@Bean注解的细节:
- Bean的名称默认为方法名字,也可以通过@Bean(name="beanName")指定名称。
- 可以通过在方法上使用@PostConstruct和@PreDestroy注解来定义Bean的初始化和销毁方法。
- 可以通过@Bean的initMethod和destroyMethod属性指定Bean的初始化和销毁方法。
- 可以通过@Scope注解指定Bean的作用域。
六、Bean组件之间的调用:
- 可以直接调用其他Bean方法来获取对应的组件。
- 也可以通过形参方式注入其他组件。
七、@Import扩展:
- @Import可以将多个配置类整合成一个配置类。
- 可以使用@ImportResource导入XML配置文件。
二、SpringAop面对切面编程
2.1认识SpringAop面向切面编程
原文:认识Spring AOP面向切面编程_Alphamilk的博客-CSDN博客
核心内容:
AOP(面向切面编程)是一种编程思维,用于解决OOP(面向对象编程)中非核心代码重复和难以维护的问题。AOP通过将横切关注点(如日志、事务、权限控制等)与业务逻辑分离,实现代码的清晰、简洁和易于维护。
AOP的核心概念包括:
- 切面(Aspect):封装与业务无关的公共行为,即横切关注点,便于代码重用和降低模块之间的耦合度。
- 通知(Advice):实现切面的具体功能,如前置通知、返回通知、异常通知、后置通知和环绕通知。
- 连接点(Joinpoint):被拦截到的方法,可以在方法执行前、执行后或抛出异常时应用通知。
- 切入点(Pointcut):定位连接点的表达式,指定被选中的连接点。
- 目标(Target):被代理的目标对象。
- 代理(Proxy):在目标对象上应用通知后生成的代理对象。
- 织入(Weaving):将通知应用到目标上,生成代理对象的过程。
Spring AOP框架是基于AOP编程思维的实现,封装了动态代理技术,简化了动态代理的实现过程。通过少量的配置,指定切入点和通知类型,即可实现面向切面的编程。Spring AOP可以应用于各种场景,如日志记录、事务处理、安全控制、性能监控、异常处理、缓存控制和动态代理等,提高代码的可维护性和重用性。
2.2SpringAop基于注解配置
原文:Spring AOP基于注解方式实现和细节_Alphamilk的博客-CSDN博客
一、Spring AOP底层技术:
- JDK动态代理:使用InvocationHandler接口实现代理,需要被代理的目标类必须实现接口。
- CGLIB动态代理:通过继承被代理的目标类实现代理,不需要目标类实现接口。
- AspectJ:早期的AOP框架,Spring AOP借用了AspectJ中的AOP注解。
二、AOP编程实现步骤:
- 使用注解配置:@Aspect将类标记为切面类,定义切面逻辑和增强方法的位置;@EnableAspectJAutoProxy开启AspectJ自动代理,启用Spring AOP功能。
- 导入相关依赖:包括Spring Aspects、Spring Context和Spring Test等。
- 定义增强方法:使用注解配置指定插入目标的位置,例如@Before、@After、@AfterReturning、@AfterThrowing和@Around等。
- 补全注解:将增强类加入到IOC容器中,并设置切面注解@Component和@Aspect。
- 开启AspectJ注解注释:在配置类中使用@EnableAspectJAutoProxy注解开启注解支持。
三、获取切点详细信息的方式:
- 使用JoinPoint接口:通过JoinPoint可以获取目标对象、目标对象的类、目标对象的简单类名、方法参数数组、方法签名等信息。
- 增强方法的参数:可以在增强方法中添加JoinPoint类型的参数,然后通过该参数获取目标对象的信息。
四、切点表达式语法: 切点表达式语法包括具体值和模糊值,可以用于定义切点的匹配规则。
五、切点表达式的重用:
- 在当前类中提取:使用@Pointcut注解声明一个空方法,并在方法上加上特定的切点表达式。其他增强方法可以通过调用该空方法来复用切点。
- 创建一个存储切点的类:创建一个单独的类用于存储切点,通过@Pointcut注解定义切点表达式。其他类中的增强方法可以通过引用该存储切点类的方法来复用切点。
2.3通知注解
原文:Spring Aop--通知注解_Alphamilk的博客-CSDN博客
一、环绕注解: 环绕注解(@Around)是Spring AOP中的一种通知类型,在目标方法执行前后进行环绕操作。它可以在方法调用前后增加额外的逻辑,例如日志记录、性能监控等。使用环绕注解需要创建ProceedingJoinPoint对象,并在方法内部通过该对象控制目标方法的执行流程。
优点:
- 灵活性高:可以在目标方法执行前后插入额外的逻辑代码,对方法的执行过程进行全面控制。
- 统一处理:将通用的逻辑代码抽取到切面中,实现统一的处理逻辑,避免在各个目标方法中重复编写相同的代码。
- 可以修改返回值:可以通过修改目标方法的返回值来影响最终的结果。
缺点:
- 复杂性增加:相对于其他类型的通知,使用环绕注解稍显复杂,需要更多的理解和掌握,特别是对于ProceedingJoinPoint的使用。
- 性能开销:因为环绕注解会包裹整个目标方法的执行流程,在某些情况下可能会带来一定的性能开销,特别是处理逻辑较为复杂的情况。
- 可能引入副作用:在环绕通知中对目标方法做任意修改时,需要谨慎操作,避免引入不可预料的副作用,导致程序出现异常或不正常的行为。
二、优先级注解: 优先级注解(@Order)是Spring框架中用于定义组件加载顺序的注解。可以用在类级别或方法级别上。多个组件实现了同一个接口或继承了同一个父类时,通过@Order注解可以指定它们的加载顺序。@Order值越小,优先级越高,具有更高的加载顺序。相同优先级的组件加载顺序是不确定的,最好将优先级设置为不同的值来避免不确定性。
使用@Order注解可以针对同一个方法有不同的增强,指定增强的执行顺序。
三、Spring-Tx事务
3.1Spring-Tx事务
原文:Spring-TX 事务_Alphamilk的博客-CSDN博客
核心内容
一、事务管理的种类:
- 编程式事务:手动编写代码管理事务,操作复杂。
- 声明式事务:通过注解或配置文件控制事务,代码简洁。
二、Spring事务管理器的使用:
- 接口:Spring事务管理器用于管理事务。
- 实现类:根据持久层框架选择合适的实现类。
三、事务注解的使用:
- 标记:用于标记需要事务管理的方法或类。
- 属性:包括只读模式、超时时间、指定异常和隔离级别。
四、事务属性的分类:
- 只读模式:限制事务是否只读。
- 超时时间:限制事务执行时间。
- 指定异常:指定事务回滚的异常类型。
- 隔离级别:定义事务的隔离级别。
五、事务的传播性属性:
- 定义事务之间的关系。
- 常用的属性有REQUIRED和REQUIRES_NEW。