SpringFramework
认识SpringFramework
最首先,我们先要认识Spring和SpringFramework两者之间有什么联系?
广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。
狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。 功能有:
依赖注入(Dependency Injection)、面向切面编程(AOP)、声明式事务管理(TX)等
Spring全家桶的其他框架都是以SpringFramework框架为基础实现的!
可以说其他框架通常扩展了或者构建在 Spring Framework 的核心功能之上,以提供特定领域的解决方案或功能。
开始之前,先介绍一下什么是组件,组件就是一种工具,也就是之后说的bean对象
-
组件一定是对象
-
对象不一定是组件
直接进入重头戏!
Spring IoC容器具体接口和实现类
接口
- BeanFactory接口,提供了一种高级配置机制,能管理任何类型的对象。是SpringIoC容器标准化接口!
- ApplicationContext是BeanFactory的子接口。是对其的功能扩充:
1、更容易与AOP功能集成
2、消息资源处理
3、特定于应用程序给予此接口实现总结:
- BeanFactory提供基本功能
- ApplicationContext就是BeanFactory的扩展,添加了更多企业开发的功能。
Spring框架的配置方式(三种)
-
XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。
-
注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。
-
Java配置类方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。
现在主流:配置类+注解方式
配置的步骤都是一样的,只是越来越简洁了。步骤:
- 配置元数据(就是即将加入容器中的类或其他)
- 添加入容器(IoC)
- 注入(DI)
FactoryBean
FactoryBean
接口是Spring IoC容器实例化逻辑的可插拔性点。用于配置复杂的Bean对象,可以将创建过程存储在
FactoryBean
的getObject方法!是一种可以配置bean的bean
FactoryBean<T>
接口提供三种方法:
T getObject()
:返回此工厂创建的对象的实例。该返回值会被存储到IoC容器!
boolean isSingleton()
:如果此
FactoryBean
返回单例,则返回true
,否则返回false
。此方法的默认实现返回true
(注意,lombok插件使用,可能影响效果)。
Class<?> getObjectType()
: 返回getObject()
方法返回的对象类型,如果事先不知道类型,则返回null
。
FactoryBean和BeanFactory区别
FactoryBean 是 Spring 中一种特殊的 bean,可以在 getObject() 工厂方法自定义的逻辑创建Bean!是一种能够生产其他 Bean 的 Bean。FactoryBean 在容器启动时被创建,而在实际使用时则是通过调用 getObject() 方法来得到其所生产的 Bean。因此,FactoryBean 可以自定义任何所需的初始化逻辑,生产出一些定制化的 bean。一般情况下,整合第三方框架,都是通过定义FactoryBean实现!!!
(用于创建 bean 的接口,它提供了更加灵活的初始化定制功能)
BeanFactory 是 Spring 框架的基础,其作为一个顶级接口定义了容器的基本行为,例如管理 bean 的生命周期、配置文件的加载和解析、bean 的装配和依赖注入等。BeanFactory 接口提供了访问 bean 的方式,例如 getBean() 方法获取指定的 bean 实例。它可以从不同的来源(例如 Mysql 数据库、XML 文件、Java 配置类等)获取 bean 定义,并将其转换为 bean 实例。同时,BeanFactory 还包含很多子类(例如,ApplicationContext 接口)提供了额外的强大功能。
(用于管理 bean 的框架基础接口,提供了基本的容器功能和 bean 生命周期管理。)
FactoryBean创建实例的步骤
先创建一个要注入的类
配置xml文件
创建FacotyBean类,利用getObject方法返回某个类的bean
Message类
public class Message {private String content;
public Message(String content) {this.content = content;}
public String getContent() {return content;}
}
创建一个 FactoryBean 接口的实现
import org.springframework.beans.factory.FactoryBean;
public class MessageFactoryBean implements FactoryBean<Message> {
private String content;
// 设置消息内容public void setContent(String content) {this.content = content;}
// 返回实例化的 Message 对象@Overridepublic Message getObject() throws Exception {return new Message(content);}
// 返回对象的类型@Overridepublic Class<?> getObjectType() {return Message.class;}
// 是否是单例@Overridepublic boolean isSingleton() {return true; // 返回 true 表示返回的对象是单例}
}
SpringAOP面向切面编程
AOP是对动态代理的简化,内核还是动态代理来实现的。
术语
Aspect(切面): 是横切关注点的模块化组件。它包含了横切逻辑的实现,通常以切面类的形式存在。切面定义了在何处以及如何应用横切逻辑,例如在方法执行前、后或抛出异常时。
Advice(通知): 是切面类中的具体方法,它定义了在程序的哪个时间点应该执行横切逻辑。例如,在目标方法执行前或执行后执行特定操作。
Join Point(连接点): 在程序执行过程中定义的点,如方法的调用、异常处理等。通知可以在连接点上执行。
Pointcut(切点): 定义了连接点的集合,通知会被织入到这些连接点上。通常通过表达式指定切点的位置,允许匹配特定的连接点。
Introduction(引入): 允许向现有类添加新方法或属性。这可以让现有类实现新接口或扩展新行为,而无需修改其代码。
Weaving(织入): 是将切面与应用程序的目标对象结合起来并创建一个通知对象的过程。织入可以发生在编译时、类加载时或运行时。这样,切面的通知会被执行在相应的连接点上。
切面:重复的逻辑代码
通知:切面的执行时间
连接点:方法
4-切入点 pointcut
定位连接点的方式,或者可以理解成被选中的连接点!
是一个表达式,比如execution(* com.spring.service.impl..(..))。符合条件的每个方法都是一个具体的连接点。
实现步骤
- 在maven中添加依赖
- 实现核心代码
- 声明切面类(@Component,@Aspect)
- 配置类和包扫描(扫描切面类所在包)
- 测试
Spring声明式事务
介绍
Spring声明式事务就是spring AOP的再续继承。
因为到时候使用的时候还是直接注解使用。然后Spring已经把事务加入到切面中,分成了@Around注解这种的了。
下面是一段Java中的事务代码,Spring中其实也和这个差不多。
Connection conn = ...;try {// 开启事务:关闭事务的自动提交conn.setAutoCommit(false);// 核心操作// 业务代码// 提交事务conn.commit();}catch(Exception e){// 回滚事务conn.rollBack();}finally{// 释放数据库连接conn.close();}
实现步骤
- 在配置类上加入@EnableTransactionManagement注解
- 在方法或类上加入@Transactional注解就是开启了事务