基础[后端]spring 通过工厂获取Bean

78 阅读1分钟

使用Bean工厂获取Bean并使用

在Spring中我们可以将我们的类加入到Spring的容器中,但是获取Bean的方式除了@Autoware或@Request等,我们如何获取一类Bean工厂呢,这个概念就是工厂模式

如我们需要完成支付逻辑,但是用户可以传入不同的支付方式,我们需要调用不同的Bean来处理,如果不使用这种方式,我们需要自己独立维护支付,这样容易导致写太多不必要的判断

实现

定义Bean顶层接口

public interface Payment {
    void pay();
}

实现类

/* 阿里支付 */
public class AliPayment implements Payment {
    @Override
    public void pay() {
        System.out.println("use ali payment");
    }
}
/* 微信支付 */
public class WeCharPayment implements Payment {
    @Override
    public void pay() {
        System.out.println("use wechart payment");
    }
}

定义支付工厂接口 通过传入bean名称获取bean

public interface PaymentFactory {
    Payment getPayment(String type);
}

定义组件类

@Configuration
public class PaymentConfig {
    @Bean
    public ServiceLocatorFactoryBean serviceLocatorFactoryBean(){
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        factoryBean.setServiceLocatorInterface(PaymentFactory.class);
        return factoryBean;
    }
    @Bean(name = "w")
    @Primary
    @Scope("prototype")
    public WeCharPayment weCharPayment(){
        return new WeCharPayment();
    }
    @Bean(name = "a")
    @Scope("prototype")
    public AliPayment aliPayment(){
        return new AliPayment();
    }
}

使用

@RestController
public class PaymentController {

    @Autowired
    private PaymentFactory paymentFactory;

    @GetMapping("/pay")
    public String pay (@RequestParam String type) {
        Payment payment = paymentFactory.getPayment(type);
        payment.pay();
        return type;
    }
}