日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)

發(fā)布時(shí)間:2025/3/19 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://my.oschina.net/devleon/blog/530803?fromerr=9Z8ZFdbf

?

摘要

  自Spring3.0開(kāi) 始,Spring正式將JavaConfig引入了Spring框架,我們可以基于純Java代碼來(lái)配置Spring容器和Web容器,不再需要任何 XML文件。摒棄XML文件而采用全Java配置的模式正逐漸變成主流。當(dāng)然我們也不否認(rèn)現(xiàn)階段的一些配置還依然需要依托XML,Java應(yīng)用徹底拋棄 XML配置文件還有很長(zhǎng)的一段路要走。在本文中,我們將基于純Java代碼來(lái)配置一個(gè)Spring Web項(xiàng)目。

  回憶一下,我們通常需要在applicationContext.xml和xxx-servlet.xml中配置哪些東西?一般來(lái)講,我們會(huì)配置組 件掃描、數(shù)據(jù)源、事務(wù)管理器、自定義的一些工具類(lèi)、切面、消息轉(zhuǎn)換器、靜態(tài)資源處理以及視圖等。為了有條理的組織我們的配置類(lèi),我們將這些東西分為幾個(gè)部 分來(lái)配置。

  我們首先來(lái)配置數(shù)據(jù)源和事務(wù)管理器。既然我們是基于純Java代碼來(lái)配置,我們就需要考慮配置的可擴(kuò)展性,我們希望提供的配置能夠最大可能的適用于 不同的項(xiàng)目,而不是只能用于一個(gè)項(xiàng)目。所以,對(duì)于數(shù)據(jù)源和事務(wù)管理,我們首先提供一個(gè)抽象類(lèi)DBConfig,這個(gè)類(lèi)提供了事務(wù)管理器和一些自定義的數(shù)據(jù) 庫(kù)訪問(wèn)工具,然后提供一個(gè)實(shí)現(xiàn)數(shù)據(jù)源抽象方法。源碼如下:

package?com.kiiwow.framework.config.context.spring.rest.dbconfig;import?javax.sql.DataSource;import?org.springframework.context.annotation.Bean; import?org.springframework.jdbc.core.JdbcTemplate; import?org.springframework.jdbc.datasource.DataSourceTransactionManager;import?com.kiiwow.framework.database.jdbc.JDBCAccess; import?com.kiiwow.framework.database.jdbc.JDBCAccessContext;/***?基本的數(shù)據(jù)庫(kù)配置*?統(tǒng)一配置了數(shù)據(jù)庫(kù)訪問(wèn)工具和事務(wù)管理器 ?*?具體的數(shù)據(jù)庫(kù)配置類(lèi)需要實(shí)現(xiàn)數(shù)據(jù)源創(chuàng)建的抽象方法 ?*?這個(gè)類(lèi)為實(shí)現(xiàn)不同的數(shù)據(jù)源提供了接口 ?* ?*?@author?leon.gan ?* ?*/ public?abstract?class?DBConfig?{ ????/** ?????*?數(shù)據(jù)源,由子類(lèi)實(shí)現(xiàn) ?????*/ ????public?abstract?DataSource?dataSource(); ???? ????/** ?????*?事務(wù)管理器 ?????*/ ????@Bean ????public?DataSourceTransactionManager?dataSourceTransactionManager()?{ ????????DataSourceTransactionManager?dataSourceTransactionManager?=?new?DataSourceTransactionManager(); ????????dataSourceTransactionManager.setDataSource(dataSource()); ????????return?dataSourceTransactionManager; ????} ???? ????/** ?????*?SpringJDBC?Template ?????*/ ????@Bean ????public?JdbcTemplate?jdbcTemplate()?{ ????????JdbcTemplate?jdbcTemplate?=?new?JdbcTemplate(); ????????jdbcTemplate.setDataSource(dataSource()); ????????return?jdbcTemplate; ????} ???? ????/** ?????*?JDBC訪問(wèn)接口 ?????*/ ????@Bean ????public?JDBCAccess?jdbcAccess()?{ ????????JDBCAccess?jdbcAccess?=?new?JDBCAccess(); ????????jdbcAccess.setJdbcTemplate(jdbcTemplate()); ????????return?jdbcAccess; ????} ???? ????/** ?????*?實(shí)際用于執(zhí)行SQL的工具 ?????*/ ????@Bean ????public?JDBCAccessContext?jdbcAccessContext()?{ ????????JDBCAccessContext?jdbcAccessContext?=?new?JDBCAccessContext(); ????????jdbcAccessContext.setJdbcAccess(jdbcAccess()); ????????return?jdbcAccessContext; ????} ???? }

  我們需要將DBConfig中的事務(wù)管理器和數(shù)據(jù)庫(kù)訪問(wèn)工具注冊(cè)成為被Spring管理的Bean,在方法上添加@Bean注解即可,默認(rèn)是單例。 這個(gè)類(lèi)并沒(méi)有指定具體的數(shù)據(jù)源,而是由子類(lèi)去實(shí)現(xiàn)dataSource()方法來(lái)指定,這樣就做到了可擴(kuò)展。(對(duì)于以上代碼中Jdbc相關(guān)的工具類(lèi),請(qǐng)參考博文《對(duì)JdbcTemplate進(jìn)行簡(jiǎn)易封裝以使其更加易用》)接下來(lái),我們提供一個(gè)BasicDataSourceDBConfig,這個(gè)類(lèi)繼承自DBConfig,并實(shí)現(xiàn)dataSource()方法提供了一個(gè)BasicDataSource數(shù)據(jù)源。源碼如下:

package?com.kiiwow.framework.config.context.spring.rest.dbconfig;import?javax.inject.Inject; import?javax.sql.DataSource;import?org.apache.commons.dbcp.BasicDataSource; import?org.springframework.context.annotation.Bean; import?com.kiiwow.framework.config.context.spring.KiiwowEnvironment; /** ?*?Apache?BasicDataSource?數(shù)據(jù)源配置 ?* ?*?@author?leon.gan ?* ?*/ public?class?BasicDataSourceDBConfig?extends?DBConfig?{ ????@Inject ????KiiwowEnvironment?environment; ???? ????@Bean ????public?DataSource?dataSource()?{ ????????BasicDataSource?ds?=?new?BasicDataSource(); ????????ds.setDriverClassName(environment.getProperty("jdbc.driver")); ????????ds.setUrl(environment.getProperty("kiiwow_jdbc.url")); ????????ds.setUsername(environment.getProperty("kiiwow_jdbc.username")); ????????ds.setPassword(environment.getProperty("kiiwow_jdbc.password")); ????????ds.setTestOnBorrow(true); ????????ds.setValidationQuery("select?1?from?dual"); ????????return?ds; ????} ???? }

我們?cè)趯?shí)際使用時(shí),只要使用BasicDataSourceDBConfig這個(gè)類(lèi)即可。同理,我們也可以提供一個(gè)C3p0DataSourceDBConfig類(lèi)來(lái)實(shí)現(xiàn)C3P0數(shù)據(jù)源,源碼如下:

package?com.kiiwow.framework.config.context.spring.rest.dbconfig;import?javax.inject.Inject; import?javax.sql.DataSource;import?org.springframework.context.annotation.Bean; import?com.kiiwow.framework.config.context.spring.KiiwowEnvironment; import?com.mchange.v2.c3p0.ComboPooledDataSource; /** ?*?C3P0數(shù)據(jù)源配置 ?* ?*?@author?leon.gan ?* ?*/ public?class?C3p0DataSourceDBConfig?extends?DBConfig?{ ????@Inject ????KiiwowEnvironment?environment; ???? ????@Bean ????public?DataSource?dataSource()?{ ????????try?{ ????????????ComboPooledDataSource?dataSource?=?new?ComboPooledDataSource(); ????????????dataSource.setDriverClass(environment.getProperty("db.c3p0.driverClassName")); ????????????dataSource.setJdbcUrl(environment.getProperty("kiiwow_db.c3p0.url")); ????????????dataSource.setUser(environment.getProperty("kiiwow_db.c3p0.username")); ????????????dataSource.setPassword(environment.getProperty("kiiwow_db.c3p0.password")); ????????????//當(dāng)連接池在沒(méi)有可用空閑連接時(shí)每次可以新增的連接數(shù) ????????????dataSource.setAcquireIncrement(environment.getRequiredProperty("c3p0.acquireIncrement",?int.class,?5)); ????????????//連接池初始連接數(shù) ????????????dataSource.setInitialPoolSize(environment.getRequiredProperty("c3p0.initialPoolSize",?int.class,?5)); ????????????//連接池可持有的最大連接數(shù) ????????????dataSource.setMaxPoolSize(environment.getRequiredProperty("c3p0.maxPoolSize",?int.class,?200)); ????????????//連接池可持有的最小連接數(shù) ????????????dataSource.setMinPoolSize(environment.getRequiredProperty("c3p0.minPoolSize",?int.class,?5)); ????????????//連接池中的連接失效的閥值(即最大未被使用時(shí)長(zhǎng)) ????????????dataSource.setMaxIdleTime(environment.getRequiredProperty("c3p0.maxIdleSize",?int.class,?1800)); ????????????//與MaxIdleTime配合使用,必須小于MaxIdleTime的值,用于減少連接池中的連接 ????????????dataSource.setMaxIdleTimeExcessConnections(environment.getRequiredProperty("c3p0.maxIdleTimeExcessConnections",?int.class,?1200)); ????????????//連接最大存活時(shí)間,超過(guò)這個(gè)時(shí)間將被斷開(kāi),正在使用的連接在使用完畢后被斷開(kāi) ????????????dataSource.setMaxConnectionAge(environment.getRequiredProperty("c3p0.maxConnectionAge",?int.class,?1000)); ????????????//進(jìn)行空閑連接測(cè)試的SQL ????????????dataSource.setPreferredTestQuery(environment.getProperty("c3p0.preferredTestQuery",?"select?1?from?dual")); ????????????//進(jìn)行空閑連接測(cè)試的時(shí)間間隔 ????????????dataSource.setIdleConnectionTestPeriod(environment.getRequiredProperty("c3p0.idleConnectionTestPeriod",?int.class,?120)); ????????????return?dataSource; ????????}?catch?(Exception?e)?{ ????????????throw?new?RuntimeException(e); ????????} ????} ???? }

  在上面的代碼中,出現(xiàn)了一個(gè)KiiwowEnvironment類(lèi),這個(gè)類(lèi)是對(duì) org.springframework.core.env.Environment的封裝,以實(shí)現(xiàn)編碼解碼功能。為了說(shuō)明這個(gè)類(lèi)的作用,我們首先來(lái)看看 Environment這個(gè)接口的作用。這個(gè)接口是與@PropertySources注解配合工作的,我們?cè)?#64;PropertySources注解中指 定的配置文件會(huì)自動(dòng)被加載到Environment的實(shí)現(xiàn)中以key-value形式存儲(chǔ),我們可以通過(guò)Environment提供的 getProperty(String key)等方法通過(guò)屬性名獲取屬性值。

  在我們的設(shè)計(jì)中有一個(gè)特殊的需求,我們希望配置在properties文件中的數(shù)據(jù)庫(kù)連接以及賬號(hào)密碼都是經(jīng)過(guò)加密的,這樣可以一定程度上防止數(shù)據(jù)庫(kù)信息泄 露。所以我們定義在properties文件中所有以"kiiwow_"開(kāi)頭的屬性,其對(duì)應(yīng)的值都是經(jīng)過(guò)Base64編碼的結(jié)果,所以在我們通過(guò) Environment取出這些值的時(shí)候也要進(jìn)行解碼。不幸的是,Environment并不具備編碼解碼功能,我們需要自己實(shí)現(xiàn),所以有了 KiiwowEnvironment這個(gè)類(lèi)。源碼如下:

package?com.kiiwow.framework.config.context.spring;import?javax.inject.Inject;import?org.springframework.core.env.Environment; import?org.springframework.stereotype.Component; import?com.kiiwow.framework.util.DigestUtils; /** ?*?自定義環(huán)境類(lèi) ?*?基于JavaConfig配置Spring的情況下,使用@PropertySource注解將配置屬性注入Environment中后 ?*?Environment不能支持解碼已編碼的屬性值。所以提供這個(gè)類(lèi)對(duì)數(shù)據(jù)獲取進(jìn)行解碼操作。 ?* ?*?@author?leon.gan ?* ?*/ @Component public?class?KiiwowEnvironment?{ ????@Inject ????Environment?env; ???? ????/** ?????*?所有以kiiwow_開(kāi)頭的屬性,其值都需要經(jīng)過(guò)Base64解碼后使用 ?????*/ ????public?String?getProperty(String?propertyName)?{ ????????if?(propertyName.startsWith("kiiwow_"))?{ ????????????String?originalValue?=?env.getProperty(propertyName); ????????????return?DigestUtils.decodeBase64(originalValue); ????????}?else?{ ????????????return?env.getProperty(propertyName); ????????} ????} ???? ????/** ?????*?沒(méi)有配置屬性時(shí)采用默認(rèn)值 ?????*/ ????public?String?getProperty(String?propertyName,?String?defaultValue)?{ ????????if?(propertyName.startsWith("kiiwow_"))?{ ????????????String?originalValue?=?env.getProperty(propertyName); ????????????return?originalValue?==?null???null?:?DigestUtils.decodeBase64(originalValue); ????????}?else?{ ????????????return?env.getProperty(propertyName)?==?null???defaultValue?:?env.getProperty(propertyName); ????????} ????} ???? ????/** ?????*?將值轉(zhuǎn)換為指定類(lèi)型 ?????*/ ????public?<T>?T?getRequiredProperty(String?propertyName,?Class<T>?targetType)?{ ????????return?env.getRequiredProperty(propertyName,?targetType); ????} ???? ????/** ?????*?屬性不存在則返回默認(rèn)值 ?????*/ ????public?<T>?T?getRequiredProperty(String?propertyName,?Class<T>?targetType,?T?defaultValue)?{ ????????try?{ ????????????return?env.getRequiredProperty(propertyName,?targetType); ????????}?catch?(Exception?e)?{ ????????????return?defaultValue; ????????} ????} ???? }

  從上面的代碼可以看到,我們只是將org.springframework.core.env.Environment 注入,然后在調(diào)用他的getProperty(String key)等方法前增加了判斷屬性名是否以"kiiwow_"開(kāi)頭的邏輯。同時(shí)提供了處理屬性名不存在于配置文件則返回默認(rèn)值的方法。特別注意,我們需要將 這個(gè)類(lèi)注冊(cè)成為Spring容器的一個(gè)組件,即在類(lèi)上使用@Component注解,否則org.springframework.core.env.Environment是無(wú)法注入的。(這個(gè)解決方法特別感謝@YouKnowNothing 的幫助)。

  至此,我們對(duì)于數(shù)據(jù)源和事務(wù)管理的配置就結(jié)束了。我們可以自由繼承DBConfig類(lèi)來(lái)擴(kuò)展我們需要的數(shù)據(jù)源,也能對(duì)配置文件中的敏感信息進(jìn)行編碼 防止信息泄露。不過(guò)需要指出的是,這種處理敏感信息的方法依然不是最優(yōu)的。由于我們要進(jìn)行解碼,所以我們只能使用雙向加密策略,如果別人知道了你的編碼策 略,也能夠輕松破解。我們將在下一篇文章中講解對(duì)于靜態(tài)資源、視圖解析器、消息轉(zhuǎn)換器的配置以及web.xml的Java代碼化。

感謝您的閱覽,勞煩點(diǎn)個(gè)贊。

轉(zhuǎn)載于:https://www.cnblogs.com/SummerinShire/articles/5583767.html

總結(jié)

以上是生活随笔為你收集整理的springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。