2016-04-19 6 views
0

私は私のクラスの二つのフィールドました:CDI @Dependentと@New

public class Class { 

    @Inject private ClassA a; 
    @Inject private ClassB b; 

    public void search(String lqlSentence) 
    { 
     this.a.something(); 
     AnotherClass anotherOne = new AnotherOne; 
     anotherOne.method(this.b); 
    } 
} 

CDIは私に語った:

@default修飾子とタイプにClassAのため

不満の依存関係をしかし、CDIはClassB bフィールドについて何かを教えてくれます。

その後、私は@Dependent注釈を追加しました:

@Inject @Dependent private ClassA a; 

CDIは私に同じことを伝えます。

ただし、このフィールドに@Newと注釈を付けるとCDIが機能します。

@Newを使用するのはなぜですか? CDIが他のプロパティについて何か教えてくれないのはなぜですか?Class B

答えて

1

この修飾子注釈(@Dependent)は、クラス定義自体、またはそのBeanのプロデューサになります。噴射点にはない。

また、@Newを使用しないでください。その非難された。これは従属変数と同じように機能しますが、注入点側から駆動され、CDIはプロデューサ側でフォーカスされます。

+0

私はそれを得ました。ありがとう。 – Jordi

+0

CDIが '@Inject private ClassA a;'について私に警告する理由はまだ分かりませんし、 '@Inject private ClassB b;'の2番目のフィールドについては何も教えてくれません... – Jordi

+0

"警告する"とはどういう意味ですか?ログメッセージ?あなたはそれぞれの定義を共有できますか? –

0

Java EEのCDIは、「種類」で動作します。 異なるクラスによって実装されているインターフェースを持っていて、そのインターフェースを注入しようとすると、CDIは注入するBeanインスタンスのタイプを解決できないというタイプの不明瞭さに不平を言うでしょう。元の場合 は:CDIは

  1. UserDaoがある今、私たちはUserDaoの3つの異なる種類を持っているだって注入するどの実装を決定することができません

    public interface UserDao{ 
        // methods...... 
    } 
    
    public class UserDaoMongoImpl implements UserDao{ 
        //Mongo db implementations.... 
    } 
    
    public class UserDaoOrclImpl implements UserDao{ 
        // oracle Db specific implementations for userDao 
    } 
    
    @Stateless 
    public class UserServiceImpl implements UserService{ 
    
        @Inject private UserDao userDao; //injectPoint 
    
        //service impl ... 
    
    } 
    

    を次にここに: は、私たちはこのような何かを考えてみましょうUserDao

  2. UserDaoMongoImplは
  3. UserDaoOrclImplがUserDao
01 UserDaoあります

これは、CDIのすべての種類の混乱を引き起こします。

これを克服するために、単純な注釈である修飾語を使用します。だから今、このCDIを使用すると、常にその注入点で注入すると、このタイプのあいまいさも文句はありませんどの実装や、どのタイプを知っているだろう

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD,ElementType.TYPE}) 
public @interface MongoImplementation { 
} 

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD,ElementType.TYPE}) 
public @interface OrclImplementation { 
} 


public interface UserDao{ 
    // methods...... 
} 

@MongoImplementation 
public class UserDaoMongoImpl implements UserDao{ 
    //Mongo db implementations.... 
} 

@OrclImplementation 
public class UserDaoOrclImpl implements UserDao{ 
    // oracle Db specific implementations for userDao 
} 

@Stateless 
public class UserServiceImpl implements UserService{ 

    @Inject @MongoImplementation  //Injection point A 
    private UserDao mongoUserDao; 

    @Inject @OrclImplementation  //Injection point B 
    private UserDao orclUserDao; 

    //service impl ... 

} 

は、したがって、上記のコードは次のようになります。