@Autowired
の例に出会いました:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
セッターメソッドがなく、プライベートであるため、empDao
がどのように設定されるのか興味がありました。
Javaでは、リフレクションフレームワークの一部である AccessibleObject.setAccessible()
method を介して、フィールドまたはメソッドのアクセス制御をオフにすることができます(はい、最初に渡すセキュリティチェックがあります) Field
およびMethod
はAccessibleObject
から継承します)。フィールドを検出して書き込みができるようになったら、残りの作業は非常に簡単です。単に プログラミングの単純な問題 。
Javaでは、リフレクションを介してクラスのプライベートメンバーと対話できます。
ReflectionTestUtils をチェックしてください。これは単体テストを書くのに非常に便利です。
セッターは不要です。SpringがApplicationContextに含まれるコンポーネントの一部として識別するために、注釈@component
でEmpDao
クラスを宣言する必要があります。
次の2つのソリューションがあります。
<bean class="package.EmpDao" />
<context:component-scan base-package="package" />
<context:annotation-config />
[〜#〜] and [〜#〜]スプリングアノテーションを使用して、スプリングコンテナがコンポーネントとして管理するクラスを宣言します。
@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
およびMyClass
の存在を認識しており、EmpDao
内のMyClass
のインスタンスを自動的にインスタンス化します。