/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.framework.container.factory;
import java.lang.reflect.Field;
import org.seasar.framework.beans.BeanDesc;
import org.seasar.framework.beans.PropertyDesc;
import org.seasar.framework.container.AutoBindingDef;
import org.seasar.framework.container.ComponentDef;
import org.seasar.framework.container.InstanceDef;
import org.seasar.framework.container.PropertyDef;
/**
* クラスに指定されたアノテーションからコンポーネント定義を作成するためのインターフェースです。
* <p>
* このアノテーションにより、コンポーネント名やインスタンス属性, プロパティやアスペクト,初期化メソッド等の設定が可能です。
* </p>
* <p>
* 指定されるの定義の優先度について。 <br>
* 以下の順によって指定された定義が上書きされます。注意してください。
* </p>
* <ul>
* <li>デフォルト値
* <li>アノテーション
* <li>設定ファイル(diconファイル)
* </ul>
*
* @author vestige
*/
public interface AnnotationHandler {
/**
* クラス名、インスタンス定義を指定してコンポーネント定義を作成します。
*
* @param className
* クラス名
* @param instanceDef
* インスタンス定義
* @return コンポーネント定義
*/
ComponentDef createComponentDef(String className, InstanceDef instanceDef);
/**
* クラス名、インスタンス定義、自動バインディング定義を指定してコンポーネント定義を作成します。
*
* @param className
* クラス名
* @param instanceDef
* インスタンス定義
* @param autoBindingDef
* 自動バインディング定義
* @return コンポーネント定義
*/
ComponentDef createComponentDef(String className, InstanceDef instanceDef,
AutoBindingDef autoBindingDef);
/**
* クラス名、インスタンス定義、自動バインディング定義、外部バインディングの有無を指定してコンポーネント定義を作成します。
*
* @param className
* クラス名
* @param instanceDef
* インスタンス定義
* @param autoBindingDef
* 自動バインディング定義
* @param externalBinding
* 外部バインディングの有無
* @return コンポーネント定義
*/
ComponentDef createComponentDef(String className, InstanceDef instanceDef,
AutoBindingDef autoBindingDef, boolean externalBinding);
/**
* コンポーネント名、インスタンス定義を指定してコンポーネント定義を作成します。
*
* @param componentClass
* コンポーネントクラス
* @param instanceDef
* インスタンス定義
* @return コンポーネント定義
*/
ComponentDef createComponentDef(Class componentClass,
InstanceDef instanceDef);
/**
* コンポーネントクラス、インスタンス定義、自動バインディング定義を指定してコンポーネント定義を作成します。
*
* @param componentClass
* コンポーネントクラス
* @param instanceDef
* インスタンス定義
* @param autoBindingDef
* 自動バインディング定義
* @return コンポーネント定義
*/
ComponentDef createComponentDef(Class componentClass,
InstanceDef instanceDef, AutoBindingDef autoBindingDef);
/**
* コンポーネントクラス、インスタンス定義、自動バインディング定義、外部バインディングを指定してコンポーネント定義を作成します。
*
* @param componentClass
* コンポーネントクラス
* @param instanceDef
* インスタンス定義
* @param autoBindingDef
* 自動バインディング定義
* @param externalBinding
* 外部バインディング
* @return コンポーネント定義
*/
ComponentDef createComponentDef(Class componentClass,
InstanceDef instanceDef, AutoBindingDef autoBindingDef,
boolean externalBinding);
/**
* コンポーネント定義にプロパティ定義を追加します。
*
* @param componentDef
* コンポーネント定義
*/
void appendDI(ComponentDef componentDef);
/**
* コンポーネント定義にアスペクト定義を追加します。
*
* @param componentDef
* コンポーネント定義
*/
void appendAspect(ComponentDef componentDef);
/**
* コンポーネント定義にインタータイプ定義を追加します。
*
* @param componentDef
* コンポーネント定義
*/
void appendInterType(ComponentDef componentDef);
/**
* コンポーネント定義に初期化メソッドを追加します。
*
* @param componentDef
* コンポーネント定義
*/
void appendInitMethod(ComponentDef componentDef);
/**
* コンポーネント定義に初期化メソッドが追加可能かどうかを返します。
*
* @param cd
* コンポーネント定義
* @param methodName
* 初期化の対象にするメソッド名
* @return 初期化メソッドとして追加可能な場合、<code>true</true>、そうでない場合は<code>false</code>を返す。
*/
boolean isInitMethodRegisterable(ComponentDef cd, String methodName);
/**
* コンポーネント定義にdestroyMethodを追加します。
*
* @param componentDef
* コンポーネント定義
*/
void appendDestroyMethod(ComponentDef componentDef);
/**
* コンポーネント定義にdestroyメソッドが追加可能かどうかを返します。
*
* @param cd
* コンポーネント定義
* @param methodName
* 初期化の対象にするメソッド名
* @return destroyMethodとして追加可能な場合、<code>true</true>、そうでない場合は<code>false</code>を返す。
*/
boolean isDestroyMethodRegisterable(ComponentDef cd, String methodName);
/**
* プロパティ名を指定してコンポーネント定義に追加するプロパティ定義を作成します。
*
* @param beanDesc
* プロパティに追加するBean名。
* @param propertyDesc
* プロパティ名
* @return プロパティ定義
*/
PropertyDef createPropertyDef(BeanDesc beanDesc, PropertyDesc propertyDesc);
/**
* フィールドを指定してコンポーネント定義に追加するプロパティ定義を作成します。
*
* @param beanDesc
* プロパティに追加するBean名。
* @param field
* フィールド名
* @return プロパティ定義
*/
PropertyDef createPropertyDef(BeanDesc beanDesc, Field field);
}