Spring-04 配置補充

一、靈活配置DataSource

1、使用屬性文件配置數據源

database.properties文件如下

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms
username=root
password=1998
  • 步驟一:引入properties文件
	<!-- 引入properties文件 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<!--引入單個屬性文件-->
		<property name="location">
			<value>classpath:database.properties</value>
		</property>
		<!--引入多個文件-->
		<property name="locations">
			<list>
					<value>classpath:屬性文件1</value>	
					<value>classpath:屬性文件2</value>	
					<!--使用通配符(*)一次性引入多個文件-->
					<value>classpath:*.properties</value>	
			</list>
		</property>
	</bean>
  • 步驟2:配置DataSource
	<!--配置DataSource  -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${driver}"/>
		<property name="url" value="${url}"/>
		<property name="username" value="${username}"/>
		<property name="password" value="${password}"/>
	</bean>

2、使用JNDI數據源

  • 步驟一:在Tomcat中的lib文件夾下加入數據庫驅動包
  • 步驟二:在tomcat下的context.xml中配置JDNI數據源,編寫連接數據庫配置
	<Context>
		<Resource name="jdbc/smbms" auth="Container" type="javax.sql.DataSource"
		maxActive="100" maxIdle="30" maxWait="10000" username="root"
		password="root" driverClassName="com.mysql.jdbc.Driver" 
		url="jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8"/>
	</Context>

  • 步驟三:在Spring配置文件中通過JNDI配置DataSource
	<!-- 通過jndi配置DataSource -->
	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<!-- 通過jndiName指定引用的jndi數據源名稱-->
		<property name="jndiName">
			<value>java:comp/env/jdbc/smbms</value>
		</property>
	</bean> 

注: Context.xml中的<Resource>元素的name 表示爲JNDI數據源名稱,name的屬性值需要與Spring配置文件中jndiNamejava:comp/env/後的名稱保持一致。

二、Spring中Bean的作用域

1、理解Bean的五種作用域

  • singleton
    默認值。以單例模式創建Bean的實例,即容器中該Bean的實例只有一個。(等同於static)
  • prototype
    每次從容器中獲取Bean時,都會創建一個新的實例。(new一次)
  • request
    用於Web應用環境,針對每次HTTP請求都會創建一個實例。
  • session
    用於Web應用環境,同一個會話共享一個實例,不同的會話使用不同的實例。
  • global session
    僅在Portlet的Web應用中使用,同一個全局會話共享一個實例;對於非Portlet環境,等同於session。

注:
(1)singleton是默認採用的作用域,即默認情況下Spring爲每個Bean僅創建一個實例,對於不存在線程安全問題的組件,採用這種方式可以大大減少創建對象的開銷,提高運行效率。
(2)而對於存在線程安全問題的組件,則不能使用singleton模式,可以使用prototype作用域,通過scope屬性,代碼如下

<bean id="xxx" class="xxx" scope="prototype"/>

2、使用註解指定Bean的作用域

	@Scope("prototype")	//註解設置該Bean的作用域爲prototype
	@Service("userService")
	public class UserServiceImpl implements UserService {
	
		@Resource(name="userMapper")
		private UserMapper userMapper;
	
		public void setUserMapper(UserMapper userMapper) {
			this.userMapper = userMapper;
		}
	}

三、Spring的自動裝配

1、採用傳統的xml方式配置Bean組件

	<!-- 配置UserMapper -->
	<bean id="userMapper" class="cn.smbms.dao.user.UserMapperImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean> 
	
	<!-- 配置業務Bean並注入DAO實例 -->
	<bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
		<property name="userMapper" ref="userMapper"/>
	</bean> 

2、使用自動裝配

	<!--使用自動裝配-->
	<!--配置DAO 根據屬性名稱自動裝配  -->
	<bean id="userMapper" class="cn.smbms.dao.user.UserMapperImpl" autowire="byName"/>
	
	<!-- 配置業務bean,根據屬性名稱自動裝配 -->
	<bean id="userService" class="cn.smbms.service.user.UserServiceImpl"autowire="byName"/>

3、autowire屬性值及其說明

  • no:不適用自動裝配。Bean依賴關係必須通過property元素定義。

  • byType:根據屬性類型自動裝配。BeanFactory查找容器中全部的Bean,如果正好有一個與依賴屬性類型相同的Bean,就自動裝配這個屬性;如果有多個,Spring無法決定注入哪個Bean,則會拋出致命異常;如果沒有匹配的Bean,則屬性不會被設置。

  • byName:根據屬性名自動裝配。BeanFactory查找容器中的全部Bean,找出id與屬性的setter方法匹配的Bean,找到即自動注入,否則什麼都不做

  • constructor:與byType的方式類似,不同之處就在於它應用於構造器參數,如果在容器中沒有找到與構造器參數類型一致的Bean,那麼將會拋出異常。

4、全局自動裝配

<beans>元素提供了default-autowire屬性,設置全局自動裝配。

例:

<beans default-autowire="byName"/>
	<!--省略部分代碼-->
</beans>

注: 對於大型的應用,不鼓勵使用自動裝配,雖然使用自動裝配可減少配置工作量,但大大降低了依賴關係的清晰性與透明性,依賴關係的裝配僅依賴於源文件的屬性名或類型,導致Bean與Bean之間的耦合降低到代碼層次,不利於高層次解耦合。

四、拆分Spring配置文件

1、拆分策略

  • 橫向拆分(適用於大項目,模塊、需求較多):如果一個開發人員負責一個模塊,我們採用公用配置(包含數據源、事務等)+每個系統模塊一個單獨配置文件(包含Dao、Service及Web控制器)的形式。
  • 縱向拆分:如果開發是按照分層進行的分工,我們採用公用配置(包含數據源、事務等)+Dao Bean配置+業務邏輯Bean + Web控制器配置的形式。

2、拆分方法

加載拆分後的Spring配置文件,使用ClassPathXmlApplicationContext類的重載構造方法。

	public ClassPathXmlApplicationContext(String configLocation);
	public ClassPathXmlApplicationContext(String configLocations);
  • 方式一:
	ApplicationContext ctx=new ClassPathXmlApplicationContext(
		"applicationContext.xml",
		"applicationContext-dao.xml",
		"applicationContext-service.xml");
  • 方式二:
	String configs={"applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml"}
	ApplicationContext ctx=new ClassPathXmlApplicationContext(configs);
  • 方式三:使用通配符*來加載多個具有一定命名規則的配置文件
    (建議採用此種方式)
	ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext*.xml");
  • 方式四:Spring配置文件本身也可以通過import子元素導入其他配置文件,將多個配置文件整合到一起,形成一個完整的Spring配置文件。
    例:
	<import resource="applicationContext-dao.xml"/>
	<import resource="applicationContext-service.xml"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章