私はの例に出くわしました@Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
empDao
セッターメソッドがなく、プライベートであるため、get がどのように設定されるかについて興味がありました。
私はの例に出くわしました@Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
empDao
セッターメソッドがなく、プライベートであるため、get がどのように設定されるかについて興味がありました。
Java では、リフレクション フレームワークの一部であるAccessibleObject.setAccessible()
メソッドField
(とMethod
から継承) を介して、フィールドまたはメソッドのアクセス制御をオフにすることができます (そうです、最初に渡すセキュリティ チェックがありAccessibleObject
ます)。フィールドが検出されて書き込まれるようになると、残りの作業は非常に簡単です。単なるプログラミングの問題です。
Java では、リフレクションを介してクラスのプライベート メンバーと対話できます。
単体テストの作成に非常に便利なReflectionTestUtilsを確認してください。
セッターは必要ありません。Spring がApplicationContext に含まれるコンポーネントの一部としてクラスを識別するためにEmpDao
、アノテーションを使用してクラスを宣言するだけです...@component
2 つの解決策があります。
<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
。