Java scope和TransactionConfiguration-阿里云开发者社区

开发者社区> 沉默王二> 正文

Java scope和TransactionConfiguration

简介: Java scope和TransactionConfiguration
+关注继续查看

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)


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26789 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10080 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2511 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12072 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
11818 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9159 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4659 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4504 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载