spring 事务与自动装配

本文详细介绍了如何在Spring框架中配置数据源、自动装配的几种方式、依赖注入的原理,以及Bean的作用域和事务一致性问题(脏读、幻读、不可重复读)。

一.配置数据源

首先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再次读取同一个用户的余额时,却发现已经发生了变化,结果不同于前一次的读取
 


 


 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值