Kami sering menghadapi masalah dengan beberapa sumber data dalam proyek, terutama proyek seperti sinkronisasi data atau tugas waktu. Hal yang paling merepotkan tentang beberapa sumber data adalah tidak mengkonfigurasi beberapa sumber data, tetapi cara mengganti sumber data dengan cara yang fleksibel dan dinamis. Misalnya, dalam proyek Spring dan Hibernate Framework, kami sering mengkonfigurasi sumber data dalam konfigurasi Spring untuk terhubung ke database, dan kemudian mengikatnya ke sessionFactory, dan kemudian menentukan SesiFactory dalam kode lapisan DAO untuk melakukan operasi basis data.
Seperti yang ditunjukkan pada gambar di atas, setiap blok terikat akan terikat. Jika beberapa sumber data, itu hanya bisa sama dengan gambar di bawah ini.
Dapat dilihat bahwa dua sesiFactory telah ditulis dalam Kode Lapisan DAO. Dengan cara ini, jika ada sumber data lain di masa mendatang, Anda harus mengubah kode dan menambahkan sessionFactory. Jelas, ini tidak sesuai dengan prinsip pembukaan dan penutupan.
Maka cara yang benar untuk melakukannya seharusnya
Kodenya adalah sebagai berikut:
1. ApplicationContext.xml
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: cache = "http://www.springframework.org/schema/cache" xmlns: context = "http:/schaMa/cache" xmlns: context = "http:/schema.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org.org. yang” xmlns: jdbc = "http://www.springframework.org/schema/jdbc" xmlns: jee = "http://www.spramework.org/schema/jee" xmlns: jms = "http:org.org/schema" xmlns: jms = "http: http:schema" xmlns: jms = "http:org xmlns: lang = "http://www.springframework.org/schema/lang" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: Oxm = "http:oka. xmlns: p = "http://www.springframework.org/schema/p" xmlns: Task = "http://www.springframework.org/schema/task" xmlns: tx = "http:/schema.skem.smlns: tx =" http:/schema xmlns: util = "http://www.springframework.org/schema/util" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.spramework.org http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/schema http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd http:/www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/jdbc: http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd http://www.springframework.org/schema/task/task/www.springframework.org/schema/task:tp:tp:tp:tas http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/schema http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <context:annotation-config /> <context:component-scan base-package="com"></context:component-scan> <bean> <property name="locations"> <list> <value>classpath:com/resource/config.properties</value> </list> </preate> </ bean> <bean id = "DataSourceone" Destroy-Method = "Close"> <properti name = "driverclass" value = "$ {dbone.jdbc.driverclass}"/> <nama properti = "jdbCurl" value = "$ {dbone.jdbc.url" jdbcurl "value =" $ {dbone.jdbc.url "jdbcurl" value = "$ {dbone.jdbc.url" "" "" $ {dbone.jdbc.url "jdbcurl" $ "$ {dbone.jdbc value = "$ {dbone.jdbc.user}" /> <name properti = "kata sandi" value = "$ {dbone.jdbc.password}" /> <name properti = "initialpoolSize" value = "$ {dbone.jdbc.initialpoolSize}" /<"pit" pit "pit" pit " value = "$ {dbone.jdbc.minpoolsize}" /> <name properti = "maxpoolSize" value = "$ {dbone.jdbc.maxpoolsize}" /> </tean> <bean id = "DataSourCetWo" Destroy-Method = "Tutup"> <Bean = "DataSourCetwo" Destroy-Method = "Tutup"> <Bean = "Driving" value = "$ {dbtwo.jdbc.driverclass}" /> <name properti = "jdbcurl" value = "$ {dbtwo.jdbc.url}" /> <name properti = "user" value = "$ {dbtwo.jdbc.user}" /" /" value = "$ {dbtwo.jdbc.password}" /> <name properti = "initialpoolsize" value = "$ {dbtwo.jdbc.initialpoolSize}" /> <nama properti = "MINPOOLSIZE" value = "$ {dbtwo.jdbc.minpoolzezezeze =" $ "" $ "" $ "" $ " value = "$ {dbtwo.jdbc.maxpoolsize}"/> </ bean> <bean id = "dynamicDataSource"> <name properti = "targetDataSources"> <peta key-type = "java.lang.string"> <entri value-ref = "datasource" ke Key = "datase"> <entri-ref = "DatasOurce" KEY = "DATASE =" DATASE "> <Masuk Nilai-Ref =" DATASOURCEONE "KEY" KEY " value-ref = "DataSourCetWo" key = "DataSourCetWo"> </dert> </peta> </prively> <Properti Nama = "DefaultTargetDataSource" Ref = "DataSourceOne"> </propert> </bean> <bean id = "sessionfactory"> <Properti Nama Properti = "DataSource" name = "HibernateProperties"> <props> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> <prop key = "hibernate.current_session_context_class"> org.springframatework.orm.orm. key = "hibernate.show_sql"> false </prop> <prop key = "hibernate.format_sql"> true </por> <prop key = "hbm2ddl.auto"> Buat </props> </props> </properti </property name = "packageStoscan"> </list> </property </property name = "packagestoscan"> <list> </list> com. id = "TransactionManager"> <properti name = "sessionFactory" ref = "sessionfactory" /> </ bean> <aop: config> <aop: pointcut id = "transactionpointcut" ekspresi = "eksekusi (*com.dao ..*.*. (..)" /> <aop: advisor advisor-ref = "txadadpoP =" point "point" /point " /point" /point (aOP: TXPOOP = "POINT" /POINT " /POINT" <tx: nasihat id = "txadvice" transaction-manager = "transactionManager"> <tx: atribut> <tx: nama metode = "tambahkan*" propagasi = "diperlukan" /> <tx: nama metode = "save*" propagation = "wajib" /> <tx: nama metode = "update*" propagation = "wajib" /" /> <" tx: Metode nama = "update*" propagation = "wajib" /" <TX: Metode Name = "*" baca-only = "true" /> </tx: atribut> </tx: nasihat> <aop: config> <aop: aspek id = "datasourceaspect" ref = "dATasourceIntercept"> <aop: pointcut = "DaoOne" ekspresi = "eksekusi (*com. ID = "Daotwo" Expression = "Eksekusi (*com.dao.two.*.*(..))" /> <aop: sebelum pointcut-ref = "daoone" metode = "setDataSourceOne" /<aop: sebelum pointcut-ref = "Daotwo" Method = "setDataSourCetet: aop: aop: aop: aop: aop: aop: aop: aop:" 2. DynamicDataSource.class
paket com.core; impor org.springframework.jdbc.datasource.lookup.abstractroutingDataSource; Public Class DynamicDataSource memperluas AbstractroutingDataSource {@Override Protected Object DetectionCurrentLookUpkey () {return DataBaseContExtholder.getCustomerType (); }} 3. DatabaseContextholder.class
paket com.core; Public Class DataBaseContExTholder {private static final ThreadLocal <String> contextholder = new ThreadLocal <String> (); public static void setCustomerType (String CustomErtype) {contextholder.set (customerType); } public static string getCustomerType () {return contextholder.get (); } public static void clearcustomerType () {contextholder.remove (); }} 4. DataSourceinterceptor.class
paket com.core; impor org.aspectj.lang.joinpoint; impor org.springframework.stereotype.component; @Component Public Class DataSourceInterceptor {public void setDataSourceone (joinpoint jp) {DataBaseContExtholder.setCustomerType ("DataSourceone"); } public void setDataSourCetwo (joinpoint jp) {DataBaseContExtholder.setCustomerType ("DataSourCetWo"); }} 5. Kelas Entitas PO
paket com.po; impor javax.persistence.column; impor javax.persistence.entity; impor javax.persistence.id; impor javax.persistence.table; @Entity @table (name = "btsf_brand", schema = "hotel") merek kelas publik {private string id; nama string pribadi; URL string pribadi; @Id @column (name = "id", unik = true, nullable = false, length = 10) public string getId () {return this.id; } public void setId (string id) {this.id = id; } @Column (name = "name", nullable = false, length = 50) public string getNames () {return this.names; } public void setNames (nama string) {this.names = nama; } @Column (name = "url", length = 200) Public String getUrl () {return this.url; } public void setUrl (string url) {this.url = url; }} paket com.po; impor javax.persistence.column; impor javax.persistence.entity; impor javax.persistence.id; impor javax.persistence.table; @Entity @table (name = "city", schema = "car") Kota kelas publik {private integer ID; nama string pribadi; @Id @column (name = "id", unik = true, nullable = false) integer publik getId () {return id; } public void setid (integer id) {this.id = id; } @Column (name = "name", nullable = false, length = 50) public string getName () {return name; } public void setName (name string) {this.name = name; }} 6. BranddaoImpl.class
paket com.dao.one; impor java.util.list; impor javax.annotation.Resource; impor org.hibernate.query; impor org.hibernate.SessionFactory; impor org.springframework.stereotype.repository; impor com.po.brand; @Repository kelas publik BranddaoImpl mengimplementasikan Ibranddao {@resource SesiesFactory sessionFactory yang dilindungi; @SuppressWarnings ("Uncecked") @Override Public List <drand> findAll () {string hql = "from brand"; Kueri kueri = sessionfactory.getCurrentSession (). Createqueery (HQL); return query.list (); }} 7. CitydaoImpl.class
paket com.dao.two; impor java.util.list; impor javax.annotation.Resource; impor org.hibernate.query; impor org.hibernate.SessionFactory; impor org.springframework.stereotype.repository; impor com.po.city; @Repository Public Class CitydaoImpl mengimplementasikan icitydao {@resource private sessionFactory sessionFactory; @SuppressWarnings ("Uncecked") @Override Public List <tity> find () {string hql = "from city"; Kueri kueri = sessionfactory.getCurrentSession (). Createqueery (HQL); return query.list (); }} 8. Daotest.class
paket com.test; impor java.util.list; impor javax.annotation.Resource; impor org.junit.test; impor org.junit.runner.runwith; impor org.springframework.test.context.contextConfiguration; impor org.springframework.test.context.junit4.springjunit4classrunner; impor org.springframework.test.context.transaction.transactionConfiguration; impor com.dao.one.ibranddao; impor com.dao.two.icitydao; impor com.po.brand; impor com.po.city; @Runwith (springjunit4classrunner.class) @contextConfiguration (locations = "classpath: com/resource/applicationContext.xml") @transactionConfiguration (transactionManager = "transactionManager", defaultrollback = false) public class daotest {@Resource privateer ", defaultrollback = false public class Daotest {@Resource privateer", DEFAULTROLLBACK = PUBLIC PUBLIC DaOtest {@Resource private @Resource @Resource emboDa; @Resource Private ICityDAO Citydao; @Test public void testList () {list <mand> brands = branddao.findall (); System.out.println (Brands.Size ()); Daftar <Town> kota = citydao.find (); System.out.println (Cities.size ()); }} Gunakan AOP untuk mencapai tujuan mengubah sumber data secara dinamis. Ketika kita perlu menambahkan sumber data, kita hanya perlu menambahkan konfigurasi AOP di file konfigurasi ApplicationContext dan membuat DataSourceInterceptor baru. Tanpa mengubah kode apa pun.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.