1 /*
2 * Copyright 2007-2008 Naoki NOSE.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package jp.liq.container.component;
17
18 import jp.liq.container.Resolver;
19 import jp.liq.container.reflect.MethodWrapper;
20 import jp.liq.container.reflect.ObjectFactory;
21
22 /**
23 * 他のコンポーネントのメソッドを使用してインスタンスを生成するコンポーネントです。
24 * @author nose
25 */
26 public final class ComponentMethodComponent<T> extends InjectableComponent<T, ComponentMethodComponent<T>> {
27 private final MethodWrapper method;
28 private final Class<?> ownerClass;
29
30 /**
31 * このクラスのインスタンスを構築します。
32 * @param returnType コンポーネントの型。
33 * @param method コンポーネントを生成するメソッド
34 * @param ownerClass メソッドを保持するクラス
35 */
36 public ComponentMethodComponent(Class<T> returnType, MethodWrapper method, Class<?> ownerClass) {
37 super(returnType, method.getParameterTypes());
38 this.method = method;
39 this.ownerClass = ownerClass;
40
41 }
42
43
44 /**
45 * @see jp.liq.container.component.InjectableComponent#createObjectFactory(jp.liq.container.Resolver)
46 */
47 @Override
48 protected ObjectFactory<T> createObjectFactory(Resolver resolver) {
49 Object obj = resolver.resolve(ownerClass);
50 return method.createObjectFactory(obj, getType());
51 }
52
53 /**
54 * @see jp.liq.container.Component#getDescription()
55 */
56 public Object getDescription() {
57 return method;
58 }
59
60 /**
61 * @see jp.liq.container.component.InjectableComponent#getThis()
62 */
63 @Override
64 public ComponentMethodComponent<T> getThis() {
65 return this;
66 }
67 }