一.配置数据源
首先Maven依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.5</version>
</dependency>
配置jdbc.properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/study?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=java_study
在spring配置文件中配置以下
<!--1.配置数据源-->
<context:property-placeholder location="database.properties"></context:property-placeholder>
<!--2.配置环境 配置数据源-->
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
二.自动装配
如何自动装配
配置中使用bean标签autowire属性设置自动装配的类型,例如:
<bean id="Service" class="Service.impl.ServiceImpl" autowire="byType"/>
<bean id="Service" class="Service.impl.ServiceImpl" autowire="byName"/>
<bean id="Service" class="Service.impl.ServiceImpl" autowire="constructor"/>
<bean id="Service" class="Service.impl.ServiceImpl" autowire="default"/>
<bean id="Service" class="Service.impl.ServiceImpl" autowire="no"/>
自动装配的原理
依赖注入(Dependency Injection):自动装配依赖于Spring的依赖注入机制。依赖注入是指通过构造函数、setter方法或字段注入的方式,将依赖的对象注入到目标对象中。Spring通过反射和动态代理技术实现了依赖注入,以实现对象之间的解耦和灵活性。
自动装配模式:Spring提供了多种自动装配模式,包括byName、byType、constructor和autodetect。根据配置的自动装配模式,Spring会根据目标对象的依赖类型或依赖名称,在容器中查找匹配的对象,并自动将其注入到目标对象中。
byName:根据依赖属性的名称,在容器中查找具有相同名称的bean,并注入到目标对象中。
byType:根据依赖属性的类型,在容器中查找与之匹配的bean,并注入到目标对象中。如果存在多个匹配的bean,则会抛出异常。
constructor:根据构造函数的参数类型,在容器中查找与之匹配的bean,并通过构造函数注入到目标对象中。
autodetect:根据byName和byType的方式进行自动装配。
自动扫描和组件扫描:Spring通过自动扫描机制,自动扫描指定的包或类路径,查找带有特定注解的组件,并将其注册为Spring的bean。常用的注解包括@Component、@Service、@Repository和@Controller等。当Spring容器启动时,会自动进行组件扫描,并将扫描到的组件注册为bean。
配置文件:为了启用自动装配,需要在Spring配置文件中进行相应的配置。通过<context:component-scan>元素配置自动扫描的包路径,<bean>元素配置需要自动装配的bean,以及@Autowired注解标注依赖关系等。
3.使用注解指定Bean的作用域
@Scope("prototype")
@Service public class SysUserServiceImpl implements SysUserService {
// 业务编码
}
4.Bean作用域
Singleton(默认):每个Spring容器中只有一个Bean实例,无论多少个请求或引用,都将返回同一个实例。可以通过在Bean定义中设置scope="singleton"来显式声明。
Prototype:每次请求或引用该Bean时,都将创建一个新的Bean实例。也就是说,每次获取该Bean时,都会获得一个全新的实例。可以通过在Bean定义中设置scope="prototype"来显式声明。
Request:每个HTTP请求都将创建一个新的Bean实例,在同一个请求中的多个Bean引用将共享相同的实例。适用于Web应用程序。可以通过在Bean定义中设置scope="request"来显式声明。
Session:每个用户会话都将创建一个新的Bean实例,在同一个会话中的多个Bean引用将共享相同的实例。适用于Web应用程序。可以通过在Bean定义中设置scope="session"来显式声明。
Application:整个应用程序的生命周期中只创建一个Bean实例,多个用户共享相同的实例。适用于Web应用程序。可以通过在Bean定义中设置scope="application"来显式声明。
WebSocket:每个WebSocket连接都将创建一个新的Bean实例,在同一个WebSocket连接中的多个Bean引用将共享相同的实例。适用于Web应用程序。可以通过在Bean定义中设置scope="websocket"来显式声明。
5.脏读,幻读,不可重复读
脏读指的是一个事务在读取到另一个事务尚未提交的数据时,导致读取到了未被确认的临时数据
比如:
假设有两个事务在同时处理银行账户的操作:事务A和事务B。事务A读取了账户的余额,在事务A进行修改之前,事务B也读取了同样的余额。然后,事务A进行了一次转账操作,余额减少了。此时,如果事务B也使用了之前读取到的余额,就会导致错误的结果,因为事务B读取到的余额是未经确认的临时数据。
幻读指的是事务在相同条件下多次查询时,得到了不一致的结果集
比如:
假设有两个事务在同时处理商品订单的操作:事务A和事务B。事务A根据某个条件查询了一批订单,得到了一组结果。在事务A执行完查询后的短暂间隙内,事务B增加了符合同样条件的另外一个订单。然后,事务A再次查询同样的条件,却发现结果集中又多了一行,这种新增的行就像“幻影”一样出现
不可重复读指的是一个事务在多次读取同一数据时,由于其他事务的修改操作,导致不同的读取结果
比如:
假设有两个事务在同时访问用户表的数据:事务A和事务B。事务A首先读取了某个用户的账户余额,然后事务B修改了该用户的余额,并提交了修改。接着,事务A再次读取同一个用户的余额时,却发现已经发生了变化,结果不同于前一次的读取
本文详细介绍了如何在Spring框架中配置数据源、自动装配的几种方式、依赖注入的原理,以及Bean的作用域和事务一致性问题(脏读、幻读、不可重复读)。





