52

私はの例に出くわしました@Autowired

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

empDaoセッターメソッドがなく、プライベートであるため、get がどのように設定されるかについて興味がありました。

4

4 に答える 4

44

Java では、リフレクション フレームワークの一部であるAccessibleObject.setAccessible()メソッドField(とMethodから継承) を介して、フィールドまたはメソッドのアクセス制御をオフにすることができます (そうです、最初に渡すセキュリティ チェックがありAccessibleObjectます)。フィールドが検出されて書き込まれるようになると、残りの作業は非常に簡単です。単なるプログラミングの問題です。

于 2010-08-21T16:14:59.313 に答える
7

Java では、リフレクションを介してクラスのプライベート メンバーと対話できます。

単体テストの作成に非常に便利なReflectionTestUtilsを確認してください。

于 2010-08-21T16:03:43.647 に答える
4

セッターは必要ありません。Spring がApplicationContext に含まれるコンポーネントの一部としてクラスを識別するためにEmpDao、アノテーションを使用してクラスを宣言するだけです...@component

2 つの解決策があります。

  • XML ファイル applicationContext で Bean を手動で宣言するには、次のようにします。
<bean class="package.EmpDao" />
  • コンテキスト ファイルでこれらの行を確認して自動検出を使用するには、次のようにします。
<context:component-scan base-package="package" />
<context:annotation-config />

そして、Springアノテーションを使用して、Spring コンテナーがコンポーネントとして管理するクラスを宣言します。

@Component
class EmpDao {...}

ANDでその参照に注釈を付けます@Autowired:

@Component (or @Controller, or @Service...)
class myClass {

// tells the application context to inject an instance of EmpDao here
@Autowired
EmpDao empDao;


public void useMyDao()
{
    empDao.method();
}
...
}

自動配線は、ある Bean のインスタンスを別の Bean のインスタンスの目的のフィールドに配置することによって発生します。どちらのクラスも Bean である必要があります。つまり、アプリケーション コンテキスト内で動作するように定義する必要があります。

Spring は Bean の存在を認識しておりEmpDao、 inMyClassのインスタンスを自動的にインスタンス化しEmpDaoますMyClass

于 2013-01-28T10:41:22.963 に答える
1

Spring はCGLib API を使用して、自動配線された依存性注入を提供します。


参考文献

参考文献

于 2010-08-21T07:01:13.793 に答える