springboot中使用原型模式

springboot中的bean默认是单例模式,一个类只有一个对象。

但有时候我们希望每个类有多个对象。那么处理自己new Object之外,springboot是否支持这种操作呢?

答案是肯定的。

首先我们定义一个Animal接口,和他的两个实现类

狮子只有一个,老虎有两个,所有我们给老虎Bean指定了原型模式。

public interface Animal {
    String getName();
}

//狮子只有一个
public class AnimalLion implements Animal {
    private String name;

    public AnimalLion(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}

//老虎会有两个
public class AnimalTiger implements Animal {
    private String name;

    public AnimalTiger(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}

@Configuration
public class AnimalFactory {
    @Bean(name = {"tigerA", "tigerB"})
    @Scope(value = "prototype")
    Animal getTiger(String name) {
        return new AnimalTiger(name);
    }

    @Bean
    Animal getLion() {
        String name = "lionA";
        return new AnimalLion(name);
    }

}

测试一下:

@SpringBootTest(classes= MetaCenterApplication.class)
class AnimalFactoryTest {

    @Autowired
    private AnimalFactory animalFactory;

    @Test
    void get() {
        Animal tigerA = animalFactory.getTiger("tigerA");
        Animal tigerB = animalFactory.getTiger("tigerB");
        Animal lionA = animalFactory.getLion();
        Animal lionB = animalFactory.getLion();
        System.out.println(tigerA.getName());
        System.out.println(tigerB.getName());
        System.out.println(lionA.getName());

        System.out.println(tigerA==tigerB);
        System.out.println(lionA==lionB);
    }
}

输出:

我们发现老虎果然生成了两个实例,而狮子只有一个。

tigerA
tigerB
lionA
false
true

 

posted @ 2022-07-12 10:45  Mars.wang  阅读(504)  评论(0编辑  收藏  举报