1コードのチュートリアル
1.1コードドリル1(サブライブラリーの静的プロキシ動作)
1コードのチュートリアル
1.1コードドリル1(サブライブラリーの静的プロキシ動作)
要件:
注文管理、シミュレーション前後の方法のシミュレートするために、サブライブラリーの管理を
キー:
参照キー注文静的剤、動的データ・ソースとサブライブラリー操作コンテキスト。
UMLのクラス図:
受注カテゴリ:
以下のためのパッケージ変更com.geely.design.pattern.structural.proxy; / ** *作成Orderエンティティクラス * / パブリック クラスの注文{ プライベートオブジェクトORDERINFO; // 選択した整数型の、静的プロキシクラス除算ライブラリOrderServiceStaticProxy容易にするために プライベートをユーザID整数; 公共オブジェクトgetOrderInfo(){ 戻りORDERINFOを; } 公共 ボイドsetOrderInfo(ORDERINFOオブジェクト){ この .orderInfoは= ORDERINFOを; } パブリック整数getUserId(){ 戻りユーザーIDを; } 公共 ボイドsetUserID(整数USERID){ この .userID = ユーザーID。 } }
注文DAO:
パッケージcom.geely.design.pattern.structural.proxy。 パブリック インターフェースIOrderDao { INT insertOrder(オーダー順序); }
注文daoIMPL:
パッケージcom.geely.design.pattern.structural.proxy。 パブリック クラス OrderDaoImplは実装IOrderDao { @Override 公共 int型insertOrder(受注オーダー){ System.out.printlnは( "!新增一条订单を" ); リターン 1 ; } }
オーダーサービス:
パッケージcom.geely.design.pattern.structural.proxy。 パブリック インターフェースIOrderService { INT saveOrder(オーダー順序); }
受注ServiceIMPL:
以下のためのパッケージ変更com.geely.design.pattern.structural.proxy; パブリック クラス OrderServiceImpl 実装IOrderService { プライベートIOrderDao OrderDao; @Override 公共の int型のsaveOrder(受注発注){ // 春には、我々は新しいダイレクトここで、自分自身を注入します OrderDao = 新しいOrderDaoImplを( ); System.out.printlnは( "アドオンサービスを層のDAO層は、注文を呼び出す" ); を返すorderDao.insertOrder(受注); } }
受注静的プロキシ:
パッケージcom.geely.design.pattern.structural.proxy.staticProxy; インポートcom.geely.design.pattern.structural.proxy.IOrderService; インポートcom.geely.design.pattern.structural.proxy.Order; インポートcom.geely。 design.pattern.structural.proxy.OrderServiceImpl; パブリック クラスOrderServiceStaticProxy { プライベートIOrderService OrderServiceの; / ** *メソッドの前と後のメソッドを追加 * @paramの注文 * @return * / 公共 int型saveOrder(受注発注){ beforeMethodを() ; // 春が注入され、そしてここで私はそれを新しい OrderServiceの=新しい新しいOrderServiceImpl(); / ** 方法に従って、サブライブラリーを追加するために、ここで*は、ユーザーを法、ライブラリはIの数に応じて分割される * / int型のユーザID = order.getUserID(); int型dbRouter%のユーザーID = 2 ; //実装してもよいサブライブラリー特定のシナリオでは、単純なアナログであることをここでは、同じではありません のSystem.out.println(「!データを処理するためのデータベース「[+ dbRouter + DB]」に割り当てられた帯電防止剤」); afterMethod(); を返す(注文をorderService.saveOrderを); } / ** *この参照スプリングAOP練習、事前通知方法増加する * / プライベート ボイドbeforeMethod(){ System.out.printlnは( "メソッドの前に静的剤" ); } / ** *この参照春AOPの実践、事後通知方法を増加させました * / プライベート ボイドafterMethod(){ System.out.printlnは( "メソッドの後に静的剤" ); } }
動的データソース:
パッケージcom.geely.design.pattern.structural.proxy.db; インポートorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSourceは、 / ** *サブライブラリーの操作:これらの動的なデータソースクラス * / パブリック クラスは DynamicDataSource 拡張AbstractRoutingDataSourceを{ @Override 保護オブジェクトdetermineCurrentLookupKey(){ 戻りDataSourceContextHolder.getDBTypeを(); } }
サブライブラリー業務コンテキスト:
パッケージcom.geely.design.pattern.structural.proxy.db; / ** *サブライブラリーの操作: * dbRouterコンテキストクラス、我々が設定されている場合、DAO層を実行する前に、setDBTypeはDB1へのdbTypeまたはDB0を提供し、それはDAO層これは、対応するデータベースに接続されます。 * DB0と私たちのDB1のSpringコンテナが設定されているbeanId * / パブリック クラスDataSourceContextHolder { // この変数は、DataSource、のbeanName保存することができます =新しい新しいCONTEXT_HOLDERのThreadLocal <文字列>(プライベート静的最終のThreadLocal <文字列>を);公共の静的な無効setDBType(文字列dbType){ CONTEXT_HOLDER.set(のdbType); } パブリック静的ボイドclearDBType(文字列のdbType){ CONTEXT_HOLDER.remove(); } パブリック 静的文字列getDBType(){ リターン(文字列)CONTEXT_HOLDER.get(); } }