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
145 0
|
XML Java 数据格式
Java scope和TransactionConfiguration
Java scope和TransactionConfiguration
146 0
|
Web App开发 前端开发 Java
JAVA CDI 学习(2) - Scope 生命周期
在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1、Application 生命周期 即:web application启动后,处于该生命周期级别的对象/变量,将一直存在,可以被所有web应用的用户共同访问,通常用来做网站计数器,实现流量访问之类。
1137 0
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
142 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
136 0
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
220 16
|
3月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
下一篇
oss云网关配置