web-dev-qa-db-ja.com

Springアノテーション@Autowiredはどのように機能しますか?

@Autowiredの例に出会いました:

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

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

47
Anthony

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

41
Donal Fellows

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

ReflectionTestUtils をチェックしてください。これは単体テストを書くのに非常に便利です。

7
earldouglas

セッターは不要です。SpringがApplicationContextに含まれるコンポーネントの一部として識別するために、注釈@componentEmpDaoクラスを宣言する必要があります。

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

  • XMLファイルapplicationContextでBeanを手動で宣言するには:
<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のインスタンスを自動的にインスタンス化します。

4
MrJavaJEE

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


参照資料

参考文献

1
krock