Resorte basado en anotaciones (transacción declarativa): uso simple, análisis de código original, AutoProxyRegistrar, ProxyTransactionManagementConfiguration

Fácil de usar

Clase de configuración

package jane.tx;

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/*
 * 声明式事务:
 * 环境搭建:
 * 1.导入相关的依赖:数据源,数据库驱动,spring-jdbc模块
 * 2.配置数据源,JdbcTemplate操作数据
 * 3.给方法上标注@Transactional,表示当前是一个事务方法
 * 4.@EnableTransactionManagement开启基于注解的事务管理功能
 */
@EnableTransactionManagement
@ComponentScan({
    
    "jane.tx"})
@Configuration
public class MyConfigOftx
{
    
    
	//数据源
	@Bean
	public DataSource dataSource() throws Exception
	{
    
    
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		dataSource.setUser("root");
		dataSource.setPassword("1234");
		dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
		dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8");
		return dataSource;
	}
	@Bean
	public JdbcTemplate jdbcTemplate() throws Exception
	{
    
    
		//spring对@Configuration类会特殊处理,
		//给容器中加组件的方法,多次调用都只是从容器中找组件,不会多次创建对象
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
		return jdbcTemplate;
	}
	//注册事务管理器在容器中
	@Bean
	public PlatformTransactionManager transactionManager() throws Exception
	{
    
    
		return new DataSourceTransactionManager(dataSource());
	}
}

Dao y servicio

package jane.tx;

import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class UserDao
{
    
    
	@Autowired
	JdbcTemplate jdbcTemplate;
	public void insert()
	{
    
    
		String sql="insert into user (name ,age) values (?,?)";
		String name = UUID.randomUUID().toString().substring(0, 5);
		jdbcTemplate.update(sql,name,18 );
	}
}

package jane.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService
{
    
    
	@Autowired
	UserDao userDao;
	
	@Transactional
	public void insertUser()
	{
    
    
		userDao.insert();
		System.out.println("插入成功");
		int i=10/0;
	}
}

	@Test
	public void testTX()
	{
    
    
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfigOftx.class);
		UserService userService = applicationContext.getBean(UserService.class);
		JdbcTemplate bean = applicationContext.getBean(JdbcTemplate.class);
		System.out.println(bean);
		System.out.println(userService);
		userService.insertUser();
		System.out.println("容器关闭");
		applicationContext.close();
	}

Análisis de código fuente

Haga clic en @EnableTransactionManagement para ver
@Import(TransactionManagementConfigurationSelector.class)
que se importa un selector
Inserte la descripción de la imagen aquí

Utilice TransactionManagementConfigurationSelector para importar componentes al contenedor.
Mire las propiedades de AdviceMode para importar diferentes componentes. Vea la captura de pantalla anterior
. Modo AdviceMode () por defecto AdviceMode.PROXY; el valor predeterminado es PROXY,
por lo que se importarán dos componentes
AutoProxyRegistrar
ProxyTransactionManagementConfiguration
Inserte la descripción de la imagen aquí

AutoProxyRegistrar

Haga clic en AutoProxyRegistrar, que también es para registrar componentes para el contenedor.
Inserte la descripción de la imagen aquí
Haga clic en AopConfigUtils.registerAutoProxyCreatorIfNesential (registro); uno está
registrado. InfrastructureAdvisorAutoProxyCreator的组件
Mire lo siguiente AnnotationAwareAspectJAutoProxyCreator, ¿no es este el componente registrado durante AOP?
InfrastructureAdvisorAutoProxyCreator, como el AOP anterior, también es un postprocesador
Inserte la descripción de la imagen aquí

InfrastructureAdvisorAutoProxyCreator

Haga clic para InfrastructureAdvisorAutoProxyCreatorver y
puede encontrar que no hace mucho, principalmente utilizando el mecanismo de postprocesador para envolver el objeto después de crear el objeto y devolver un objeto proxy (potenciador), y el método de ejecución del objeto proxy se llama utilizando la cadena de interceptor
Inserte la descripción de la imagen aquí

ProxyTransactionManagementConfiguration

Haga clic ProxyTransactionManagementConfiguration
para registrar el potenciador de transacciones en el contenedor,

El potenciador de transacciones necesita unotransactionAttributeSource()

Información de anotación de transacciones, análisis de anotaciones de transacciones.
Este objeto es AnnotationTransactionAttributeSource ();
es SpringTransactionAnnotationParser (analizador de primavera)
JtaTransactionAnnotationParser (analizador de
Jta ) Ejb3TransactionAnnotationParser (analizador de Ejb3)
Estos analizadores se pueden utilizar principalmente para analizar los anotadores
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

El potenciador de transacciones también necesita un interceptor de transaccionestransactionInterceptor()

TransactionInterceptor guarda la información de atributos de la transacción y el administrador de transacciones.
Haga clic en TransactionInterceptor y descubra que es un MethodInterceptor. En AOP, todos los mejoradores se empaquetarán en MethodInterceptor e
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
Inserte la descripción de la imagen aquí
ingresarán el TransactionInterceptor, método de
return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback()método invoke () .

Primero ejecute la cadena del interceptor. Solo hay TransactionInterceptor en la cadena del interceptor.
Flujo de trabajo del interceptor de transacciones :
1) Obtenga atributos relacionados con la transacción
2) Luego obtenga PlatformTransactionManager. Si no se especifica ningún TransactionManager de antemano,
eventualmente se seleccionará del contenedor de acuerdo con el tipo. Obtenga un PlatformTransactionManager
3) Método de destino de ejecución
Si es anormal, obtenga el administrador de transacciones, use el administrador de transacciones para revertir
Si el administrador de transacciones se usa normalmente para confirmar la transacción
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_43416157/article/details/108430700
Recomendado
Clasificación