如果我正在编写一个静态工厂方法来创建对象,我如何使用该工厂类的'@Component'注释并指示(带有一些注释)静态工厂方法,该方法应该被调用以创建该工厂的bean类?以下是我的意思的伪代码:
@Component
class MyStaticFactory
{
@<some-annotation>
public static MyObject getObject()
{
// code to create/return the instance
}
}
答案 0 :(得分:16)
恐怕你目前无法做到这一点。但是,Java配置非常简单:
@Configuration
public class Conf {
@Bean
public MyObject myObject() {
return MyStaticFactory.getObject()
}
}
在这种情况下,MyStaticFactory
不需要任何Spring注释。当然,你可以使用好的XML来代替。
答案 1 :(得分:7)
您需要使用弹簧界面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将检测到它是FactoryBean
并将您从getObject
返回的对象公开为bean(如果您指定了它,则为单例)。
或者,您可以为此@Bean
课程提供<bean>
或FactoryBean
声明。
答案 2 :(得分:0)
豆:
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;
}
答案 3 :(得分:0)
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"));
}
}