2016-12-02 18 views
1

私は、Spring DataとSpringに基づくJavaプロジェクトを持っています。Java Springデータ@Autowired issue

私はSpring BeanとSpringデータリポジトリをautowiredしています。そして、私はこの豆をフィールドとして自分自身に注入したい。

マイBeanは次のとおりです。

@Service @Transactional public class JobService { 

    @Autowired private ChatMessagesRepository chatMessagesRepository; 
} 

しかし、私は自分自身にこのBeanを注入しようとした場合、すべての春のデータは(と私は他人豆を信じて)クラッシュをオートワイヤリング、nullになります。なぜそれが起こるかもしれませんか?

マイ設定:

.... 
<aop:aspectj-autoproxy proxy-target-class="true"/> 
    <mvc:annotation-driven/> 

    <jpa:repositories base-package="..." 
         entity-manager-factory-ref="entityManagerFactory" 
         transaction-manager-ref="transactionManager"/> 

    <context:annotation-config/> 
    <context:component-scan base-package="..."> 
     <context:exclude-filter type="annotation" 
           expression="org.springframework.context.annotation.Configuration"/> 
    </context:component-scan> 
.... 
+0

これはsingerball beanです。 – avalon

+1

他のスコープを試しましたか? –

+1

私はJobService内の1つのメソッドをREQUIRES_NEWトランザクション内のこのクラスの他のメソッドから呼び出すようにしますが、別のメソッドから1つだけ呼び出すと、トランザクションは同じになります。 – avalon

答えて

-2

Autowiredは、パブリック変数やメソッド

@Service @Transactional public class JobService { 

    private ChatMessagesRepository chatMessagesRepository; 

    @Autowired public void setChatMessagesRepository(ChatMessagesRepository chatMessagesRepository) { 
     this.chatMessagesRepository = chatMessagesRepository; 
    } 
} 
0

に適用されますが、自分自身の中に豆を注入することはできません、それはサイクルになります。

4つのソリューションがあります。

  • ApplicationContextAware
  • カップルとAopContextと春にあなたのコードを春に
  • 使用AspectJの
  • カップルあなたのコード2つのBean(最良の方法)にあなたの豆をカット

Spring Reference

これは、そのオブジェクト参照のメソッド呼び出しがプロキシでの呼び出しであることを意味します。そのため、プロキシはその特定のメソッド呼び出しに関連するすべてのインターセプタ(アドバイス)に委譲できます。 しかし、呼び出しが最終的にターゲットオブジェクトに到達した後では、​​やthis.foo()のように、それ自身で行うことができるメソッド呼び出しは、この参照に対して呼び出され、プロキシに対しては呼び出されません。これには重要な意味があります。つまり、自己呼び出しは、メソッド呼び出しに関連するアドバイスが実行される機会を得ることにつながりません。

これはどうしたらいいですか?最良のアプローチ(ここではbestという用語は緩やかに使用されています)は、自己呼び出しが行われないようにコードをリファクタリングすることです。確かに、これはあなたの仕事の一部を伴いますが、これは最も侵略的ではないアプローチです。次のアプローチは絶対に恐ろしいです。私はそれが非常に恐ろしいので、それを正確に指摘することはほとんど怠っています。あなたは(!チョーク)完全にこれを行うことによって、春AOPにあなたのクラス内のロジックを結ぶことができます。

public class SimplePojo implements Pojo { 

    public void foo() { 
     // this works, but... gah! 
     ((Pojo) AopContext.currentProxy()).bar(); 
    } 

    public void bar() { 
     // some logic... 
    } 
} 

これは全くのカップルあなたの春AOPのコード、およびそれがされているという事実を認識してクラス自体を作りますAOPの面で飛んでいるAOPコンテキストで使用されています。

[...]

最後に、それはそれはプロキシベースのAOPフレームワークではありませんので、AspectJのは、この自己呼び出しの問題を持っていないことに注意しなければなりません。