SpringBoot 3 使用原型模式进行开发

前言

原型模式(Prototype Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方式。在 Spring 框架中,可以通过设置 Bean 为 prototype scope 来实现原型模式。

SpringBoot 中的原型模式
在 SpringBoot 中,通过添加 @Scope 注解并设置为 ConfigurableBeanFactory.SCOPE_PROTOTYPE,就可以将 Bean 设置为原型模式。
或者使用 @Scope(“prototype”) @Prototype

@Configuration
public class AppConfig {

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public PrototypeBean prototypeBean() {
        return new PrototypeBean();
    }
}

实现

开发例子

基本的原型Bean

定义原型Bean

@Component
@Scope("prototype")
public class PrototypeBean {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

使用原型Bean

@RestController
public class PrototypeController {

    @Autowired
    private ApplicationContext context;

    @GetMapping("/prototype")
    public String getPrototypeBean() {
        PrototypeBean bean = context.getBean(PrototypeBean.class);
        bean.setMessage("Hello from Prototype Bean!");
        return bean.getMessage();
    }
}

与单例Bean结合使用

有时,您可能希望在单例bean中注入原型bean。但是,由于单例bean只被创建一次,因此注入的原型bean也只会被创建一次。为了解决这个问题,您可以使用MethodInjection。

定义原型Bean

@Component
@Scope("prototype")
public class PrototypeTask {
    private final String taskId = UUID.randomUUID().toString();

    public String getTaskId() {
        return taskId;
    }
}

定义单例Bean,并注入原型Bean

@Component
public abstract class SingletonService {

    public abstract PrototypeTask getPrototypeTask();

    public String getTaskId() {
        return getPrototypeTask().getTaskId();
    }
}

使用单例Bean

@RestController
public class TaskController {

    @Autowired
    private SingletonService singletonService;

    @GetMapping("/task")
    public String getTaskId() {
        return singletonService.getTaskId();
    }
}

原型Bean与配置属性结合

您可以结合Spring Boot的配置属性来动态地为原型bean设置属性。

application.properties

prototype.message=Hello from Configured Prototype Bean!

定义原型Bean

@Component
@Scope("prototype")
public class ConfiguredPrototypeBean {
    @Value("${prototype.message}")
    private String message;

    public String getMessage() {
        return message;
    }
}

使用原型Bean

@RestController
public class ConfiguredPrototypeController {

    @Autowired
    private ApplicationContext context;

    @GetMapping("/configured-prototype")
    public String getConfiguredPrototypeBean() {
        ConfiguredPrototypeBean bean = context.getBean(ConfiguredPrototypeBean.class);
        return bean.getMessage();
    }
}

例子四

  1. 需要克隆的类实现 Cloneable 接口。
  2. 重写clone()方法。
  3. Spring提供@Prototype 注解,声明一个 Bean 的作用域为原型。
    步骤一
public class Employee implements Cloneable {
   //fields and methods 
   protected Object clone() throws CloneNotSupportedException {
       return super.clone(); 
   }
}

步骤二、三:

@Prototype
@Bean
public Employee employee(){    
    return new Employee();
}

使用:

@Autowired
Employee employee;

Employee emp1 = employee.clone();  
Employee emp2 = employee.clone();

以上创建的两个 employee 对象将是两个不同的实例。

例子1:动态生成用户对象。
例子2:缓存中存放原型对象,从中克隆出多个对象。

总结

以上就是 Spring Boot 中使用原型模式的基本概念和步骤,希望能给大家提供参考。如果有任何不清楚的地方欢迎留言讨论。

本篇文章由AI生成