2017-01-09 11 views
1

私のSpringアプリケーションは、クラスを無効にする必要のあるライブラリに依存しています。つまり、com.dep.Aとしましょう。 Aを継承するクラスBを作成し、Aが(コードまたは依存関係によって)ロードされるたびにBを読み込みたいと春に伝えたいと思います。実行時に別のクラスの代わりに特定のクラスを使用するように強制する

これを達成するスプリング設定はありますか?もしそうでなければ、AspectJはオプションになります(私はSpringがAspectJの機能を持っていると思います)?

EDIT:ユースケースで少し具体的 Aの特定のメソッドの実行フローに自分自身を接続することができたのであれば、私はかなりお待ちしています。実際には、Bを忘れてAを忘れてしまいました。私が実際に達成しようとしているのは、というメソッドの実行をインターセプトして、私のカスタムメソッド​​にoを使用することです。

+0

クラスAを別のパッケージに移動して、クラスBの名前をAに変更することができるように思えます。特別なランタイムマジックは必要ありません。それが言われている、あなたはこれがあなたがしたいことだと確信していますか? 0-10スケールの悪の10のように聞こえる。 – Cubic

+0

残念ながら、クラスAは私のSpringの依存関係にあり(私の 'pom.xml'の依存関係にリストされています)、私はそのクラスをどこからでも移動することができません。 –

+0

そのクラスのオブジェクトはSpring Beanですか?はいの場合、実行時に(XML設定を使用する場合は再コンパイルしないで)実行できますが、そうでない場合は、Springが助けません。 –

答えて

2

クラスは別のライブラリからのものなので、春の豆のようには聞こえません。その後、春はあなたを助けません。 新しいオペレータがあなたから呼び出されていないのに、ライブラリ内のコードには2つのオプションしかありません(Jarが署名されていない限り、オプションはないと思います)。

  1. ロード時間織り。これにより、カットポイントを挿入してメソッドのコードを置き換えることができます。これには、Javaエージェントを使用してJVMを起動する必要があります。
  2. ソースコードをお持ちの場合は、クラスシャドウイングを使用できます。クラスソースをソースツリー(同じパッケージ名)にコピーするだけです。これは、/classesがクラスパス内のほとんどのライブラリの前にあるため、クラスローダーがクラスをロードしようとすると、変更されたバージョンが見つかるため、元のファイルはシャドウイングされます。

私は、ソースからライブラリ全体を再構築するのが面倒だったときに、別のオープンソースライブラリで軽微な問題を修正するために2,3回使用しました。ライブラリをアップグレードするときは、基礎となるコードを変更した場合に注意しなければなりません。

0

@Autowired@Qualifierを使用して、タイプではなく名前でBeanをロードします。以下はその例です

@Autowired 
@Qualifier("b") 
private A a; 

上記のコードでは、Bも春のビーンですが、クラスBの参照が読み込まれます。

+0

これは、クラスAが使用されているコードを制御していれば動作します。残念ながら私はそれは私のSpringアプリケーション(私のpom.xmlにリストされている)の依存関係に属しているので、私はしません。 –

0

@Klaus Groenbaekの答えは正しいですが(私はそれをそうすると思いますが)、私は別の方法で問題を解決しました。

私は幸運にもcom.dep.Aに春の@ConditionalOnMissingBeanと注釈が付けられました。

したがって、単にAを拡張豆Bを作成し、メインアプリケーションのクラス宣言で:

@Bean 
public A a(){ 
    return new A(); 
} 

春は、元の1の代わりに、あなたのクラスをロードします。

関連する問題