Java scope和TransactionConfiguration

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/42706463 Java注解scope和TransactionConfiguration经常要在项目中应用,对于scope的使用,我到现在还没有彻底弄明白,虽然我已经研究出是表示多例还是单例,然而我模糊的是何时我该用单例何时用多例,我会混淆,而TransactionConfiguration注解比较简单,用来配置使用哪一个事务管理器。
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/42706463

Java注解scope和TransactionConfiguration经常要在项目中应用,对于scope的使用,我到现在还没有彻底弄明白,虽然我已经研究出是表示多例还是单例,然而我模糊的是何时我该用单例何时用多例,我会混淆,而TransactionConfiguration注解比较简单,用来配置使用哪一个事务管理器。

scope

在Java项目中,该注解表示该类的生命周期,其值为singleton(单例模式)和prototype(多例模式),简单来说,假如现在存在一个OrderService,该类使用单例模式,那么按照如下测试,可以看出

@Service
@Scope
public class OrderService {
	public void sayMyName() {
		System.out.println("MyName: " + this);
	}
}
	public static void main(String[] args) {
		SpringUtils.getSpringContext();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
	}
debug日志:
DEBUG 2015-01-14 11:13:05,622 org.springframework.beans.factory.support.AbstractBeanFactory: Returning cached instance of singleton bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@152bdc7
DEBUG 2015-01-14 11:13:05,622 org.springframework.beans.factory.support.AbstractBeanFactory: Returning cached instance of singleton bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@152bdc7
DEBUG 2015-01-14 11:13:05,622 org.springframework.beans.factory.support.AbstractBeanFactory: Returning cached instance of singleton bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@152bdc7
结论:service对象在单例情况下只有1个。

当参数为多例时:
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class OrderService {
	public void sayMyName() {
		System.out.println("MyName: " + this);
	}
}
	public static void main(String[] args) {
		SpringUtils.getSpringContext();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
		SpringUtils.getBeansByClassType(OrderService.class).sayMyName();
	}
DEBUG 2015-01-14 11:15:30,648 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory: Finished creating instance of bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@cab854
DEBUG 2015-01-14 11:15:30,648 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory: Creating instance of bean 'orderService'
DEBUG 2015-01-14 11:15:30,648 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory: Finished creating instance of bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@10bbd42
DEBUG 2015-01-14 11:15:30,648 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory: Creating instance of bean 'orderService'
DEBUG 2015-01-14 11:15:30,648 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory: Finished creating instance of bean 'orderService'
MyName: com.honzh.socket.server.business.test.OrderService@1b6772a
结论:prototype状态下,service在获取时会重新加载一个新的对象。

附上SpringUtils类,该类是为了通过applicationContext文件,加载对应的spring组件。
private static ApplicationContext factory;

	private SpringUtils() {
	};

	public synchronized static ApplicationContext getSpringContext() throws BeansException {
		if (factory == null) {
			factory = new ClassPathXmlApplicationContext("/com/honzh/socket/server/business/applicationContext.xml");
		}
		return factory;
	}

	public synchronized static ApplicationContext getSpringContext(String appContextPath) throws BeansException {
		if (factory == null) {
			factory = new ClassPathXmlApplicationContext(appContextPath);
		}
		return factory;
	}

	public static <T> T getBeansByClassType(Class<T> requiredType) {
		return factory.getBean(requiredType);
	}

TransactionConfiguration

该注解主要是用于管理spring的事务管理器,假如你的applicationContext.xml中对事务是这样配置的

	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
那么同样对于Service对象时,假如你有一个需要启用事务Transactional的方法,那么你其实是不需要为该类指定 TransactionConfiguration注解配置的。

如果你xml中的配置,如上,可以满足基本的事务操作,那么是没有必要启用该注解,如果你的xml中配置了多个事务管理器,该service对象需要区分不同的事务管理器,那么你需要通过如下格式启用TransactionConfiguration

@TransactionConfiguration(transactionManager = "transactionManager1", defaultRollback = true)

相关文章
|
Java Spring 容器
|
XML Java 数据格式
Java scope和TransactionConfiguration
Java scope和TransactionConfiguration
101 0
|
XML Java 数据格式
Java scope和TransactionConfiguration
Java scope和TransactionConfiguration
108 0
|
Web App开发 前端开发 Java
JAVA CDI 学习(2) - Scope 生命周期
在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1、Application 生命周期 即:web application启动后,处于该生命周期级别的对象/变量,将一直存在,可以被所有web应用的用户共同访问,通常用来做网站计数器,实现流量访问之类。
1067 0
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
|
9天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
19天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
11天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
7天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
下一篇
无影云桌面