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

由 a 中使用的对象实现的接口,这些对象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 将检测到它是 aFactoryBean并将您返回的对象公开getObject为 bean(如果您指定它,则为单例)。

或者,您可以为此类提供@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;
        }
    }

工厂豆:

@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 回答
1

Spring Boot:静态工厂方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

enum ParsersConst {
    bofa, jpm, wellsforgo
}

interface Parser {
    String readFromFile(String file);
}

class JPM implements Parser {
    @Override
    public String readFromFile(String file) {
        System.out.println("From JPM Parser");
        return "JPM";
    }
}

class Bofa implements Parser {
    @Override
    public String readFromFile(String file) {
        System.out.println("From Bofa Parser");
        return "BOFA";
    }
}

class WellsForgo implements Parser {
    @Override
    public String readFromFile(String file) {
        System.out.println("From Wellsforgo Parser");
        return "WellsForgo";
    }
}


class ParserCreator {

    public static Parser createParser(ParsersConst parsConst) {
        if (ParsersConst.bofa.equals(parsConst)) {
            return new Bofa();
        } else if (ParsersConst.jpm.equals(parsConst)) {
            return new JPM();
        } else if (ParsersConst.wellsforgo.equals(parsConst)) {
            return new WellsForgo();
        }
        throw new IllegalArgumentException("Unknown Parser");
    }
}
@Configuration
class ParserConfig{
    @Bean
    public Parser bofa() {
        return ParserCreator.createParser(ParsersConst.bofa);
    }
    @Bean
    public Parser wellsforgo() {
        return ParserCreator.createParser(ParsersConst.wellsforgo);
    }
    @Bean
    public Parser jpm() {
        return ParserCreator.createParser(ParsersConst.jpm);
    }
}

@Component
public class StaticFacotryDemo implements CommandLineRunner{
    @Autowired
    private ApplicationContext context;
    @Override
    public void run(String... args) throws Exception {

            Parser parser = (Parser) context.getBean(ParsersConst.jpm.toString());
            System.out.println(parser);
            System.out.println(parser.readFromFile("jan_stmt.pdf"));

    }

}
于 2020-05-13T11:08:54.757 回答