如何设计响应式布局网站,塘厦在哪里,互联网设计师工资一般多少,国外搜索网站排名前言#xff1a; 我们在进行web开发时#xff0c;基本上一个接口对应一个实现类#xff0c;比如IOrderService接口对应一个OrderServiceImpl实现类#xff0c;给OrderServiceImpl标注Service注解后#xff0c;Spring在启动时就会将其注册成bean进行统一管理。在Co…前言 我们在进行web开发时基本上一个接口对应一个实现类比如IOrderService接口对应一个OrderServiceImpl实现类给OrderServiceImpl标注Service注解后Spring在启动时就会将其注册成bean进行统一管理。在Controller层需要使用到Service层的服务组件时就通过Autowired或Resource等注解标注接口Spring会自动为我们注入接口的实现类。 OrderController
RestController
RequestMapping(/order)
public class OrderController{AutowiredIOrderService orderService;GetMapping({id})public Order getOrder(PathVariable(id) Integer id){return orderService.getOrderById(id);}} OrderServiceImpl
Service
public class OrderServiceImpl implements IOrderServiceImpl{AutowiredOrderDao orderDao;Overridepublic Order getOrderById(Integer id){if(id ! null)orderDao.getById(id);}} 在IOrderService接口只有一个实现类OrderServiceImpl时这么写当然没有问题。如果我们编写了多个IOrderService接口的实现类在不同场景需要使用不同实现类这么写还能行吗肯定不能 原因Autowired注解注入的方式是by type按类型注入一个接口如果存在多个实现类Spring将不知道应该注入哪个实现类在启动阶段就会报错。 Autowired
Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
Retention(RetentionPolicy.RUNTIME)
Documented
public interface Autowired {boolean required() default true;
} 其中还有一个required属性默认为true表示强制要求Bean实例的注入如果IOC容器不存在对应类型的BeanSpring启动时就会报错。 解决方案 1在使用Service注解配置实现类时声明bean的名称并使用Qualifier注解注入对应的实现类。 OrderServiceImpl1
//指定名称
Service(orderServiceImpl1)
public class OrderServiceImpl implements OrderService {Overridepublic String sayHello() {return 实现类1 say Hello;}} OrderServiceImpl2
//指定名称
Service(orderServiceImpl2)
public class OrderServiceImpl2 implements OrderService {Overridepublic String sayHello() {return 实现类2 say Hello;}
} OrderController
RestController
RequestMapping(/order)
public class OrderController {AutowiredQualifier(orderServiceImpl1)//使用指定名称的bean示例作为实现类OrderService orderService;GetMapping(/test)public String test(){return orderService.sayHello();}} 启动Spring并使用Postman测试接口测试结果 修改Qualifier注解为Qualifier(orderServiceImpl2)重启Spring再次测试接口测试结果 可以看到Spring容器为OrderService接口注入了不同的实现类。 2使用Resource注解。 OrderController
RestController
RequestMapping(/order)
public class OrderController {Resource(name orderServiceImpl2) //指定使用哪一个bean作为实现类OrderService orderService;GetMapping(/test)public String test(){return orderService.sayHello();}} 测试结果 原理Resource注解默认的注入方式是by name按名称注入如果你只是单纯使用Resource注解而不指定其属性那么它默认会匹配字段名。如下
RestController
RequestMapping(/order)
public class OrderController {//默认匹配bean名称为orderService的bean示例ResourceOrderService orderService;/*默认匹配bean名称为service的bean示例ResourceOrderService service;*/GetMapping(/test)public String test(){return orderService.sayHello();}} 补充如果by name注入失败那么它会通过by type继续尝试注入。当然如果此时存在多个实现类Spring会在启动阶段报错。 报错No qualifying bean of type com.hammajang.springbootdemo.service.OrderService available: expected single matching bean but found 2: orderServiceImpl,orderServiceImpl2 这里意指通过by name没有匹配到bean实例尝试通过by type时匹配到了两个bean实例Spring不知道注入哪个bean实例。 以上就是本文的全部内容如果你有所收获不妨点个赞