使用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;
}
}