自从学java开始就会知道singleton是虚拟机范围的,也就是说一个singleton的对象被创建后虚拟机内是唯一的.
但是 web应用中用户很多.大家都在访问应有服务器.如果一个类被写成singleton的,服务器的jvm中也就只有一个对象了(所以应用服务器下也就只有一个了).大家同时操作这个对象.所以要求这个对象中不要有别的数据对象.
---- 以上是我对singleton的理解.
但是在用spring的时候.我疑惑了.
我用spring和ibatis集成.配置文件很简单如下:
- XML code
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <!--1. 配置数据源 --> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" singleton="false"> <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/> <property name="url" value="jdbc:jtds:sqlserver://localhost:1433/EE"/> <property name="username" value="sa"/> <property name="password" value="1234"/> </bean> <!--2. 配置sqlMapClient 相当于hibernate的sessionFactory --> <bean id="mySqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="ibatisConfig/ibatisConfig.xml"/> <property name="dataSource" ref="myDataSource"/> </bean> <!--3. 配置DAO --> <bean id="userDaoAtXml" class="cn.luyu.ssi.dao.Impl.UserDaoImpl"> <property name="dataSource" ref="myDataSource"/> <property name="sqlMapClient" ref="mySqlMapClient"/> </bean> <!--4. 配置服务类 --> <bean id="userServiceTarget" class="cn.luyu.ssi.service.Impl.UserServiceImpl"> <property name="userDao" ref="userDaoAtXml"/> </bean> <!--5. 配置事务管理器TransactionManager --> <bean id="myTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="myDataSource"/> </bean> <!--6. 配置事务代理 --> <bean id="abstrac" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="myTransactionManager"/> <property name="transactionAttributes"> <props> <!--把CustomBuyException减去.说明它即使不是runtimeException,也会rollback--> <!--把CustomBuyException加上.说明它即使是runtimeException,也不会rollback--> <prop key="*">-DataAccessException</prop> </props> </property> </bean> <!-- 继承abstrac 方便多个service来映射 --> <bean id="userService" parent="abstrac"> <property name="target" ref="userServiceTarget"/> </bean></beans>
这里面bean后面的 singleton 属性我都没有写,所以说默认的就是单例的.我log4j打印日志片段如下:
Creating shared instance of singleton bean 'myDataSource'
Creating shared instance of singleton bean 'mySqlMapClient'
Creating shared instance of singleton bean 'userDaoAtXml'
Creating shared instance of singleton bean 'userServiceTarget'
Creating shared instance of singleton bean 'myTransactionManager'
Creating shared instance of singleton bean 'userService'
日志说明spring把所有的类都变成单例的了.我想知道这样会有问题吗???如果发布.会导致并发问题吗?
另外我觉的dataSource和SqlMapClient好像都是重量级的.应该写成singleton.但是dao和service应该写成prototype的.