一、靈活配置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&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配置文件中jndiName值java: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"/>