16

オブジェクトを作成する静的ファクトリ メソッドを作成している場合、そのファクトリ クラスに '@Component' アノテーションを使用し、そのクラスの Bean を作成するために呼び出す必要がある静的ファクトリ メソッドを (いくつかのアノテーションで) 示すにはどうすればよいですか? 以下は、私が意味する疑似コードです。

@Component
class MyStaticFactory
{
    @<some-annotation>
    public static MyObject getObject()
    {
        // code to create/return the instance
    }
}
4

4 に答える 4

17

恐れ入りますが、現在これを行うことはできません。ただし、Java 構成では非常に簡単です。

@Configuration
public class Conf {

    @Bean
    public MyObject myObject() {
        return MyStaticFactory.getObject()
    }

}

この場合MyStaticFactory、Spring アノテーションは必要ありません。もちろん、代わりに古き良き XML を使用することもできます。

于 2012-03-07T09:39:19.563 に答える
7

spring インターフェイスを使用する必要がありますFactoryBean

BeanFactoryそれ自体がファクトリである内で使用されるオブジェクトによって実装されるインターフェイス。Bean がこのインターフェースを実装する場合、それ自体が公開される Bean インスタンスとして直接ではなく、公開するオブジェクトのファクトリとして使用されます。

インターフェイスを実装し、その Bean を宣言します。例えば ​​:

@Component
class MyStaticFactoryFactoryBean implements FactoryBean<MyStaticFactory>
{
    public MyStaticFactory getObject()
        MyStaticFactory.getObject();
    }
    public Class<?> getObjectType() {
        return MyStaticFactory.class;
    }
    public boolean isSingleton() {
        return true;
    }
}

コンポーネントのスキャンにより@Component、このクラスが検出されます。Spring はそれが であることを検出し、返されたオブジェクトをBean (指定した場合はシングルトン) としてFactoryBean公開します。getObject

または、このクラスに@Beanor<bean>宣言を指定できます。FactoryBean

于 2015-03-22T15:19:55.593 に答える
1

豆:

 public class MyObject {

        private String a;

        public MyObject(String a) {
            this.a = a;
        }

        @Override
        public String toString() {
            return a;
        }
    }

FactoryBean:

@Component
public class MyStaticFactory implements FactoryBean<MyObject> {


    @Override
    public MyObject getObject() throws Exception {
        return new MyObject("StaticFactory");
    }

    @Override
    public Class<?> getObjectType() {
        return MyObject.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

使用する:

@Component
public class SomeClass{


    @Autowired
    MyObject myObject;
}
于 2016-10-19T13:50:53.693 に答える