关于@Autowired的那些事

来源:互联网 发布:使用数据库的软件 编辑:程序博客网 时间:2024/05/29 16:50

先抛个问题:

 接口

package com.che.api.test;/** * @author zhoufy * @date 2017年9月8日 下午2:25:12 */public interface OrderService {/** * 下单处理 */public void createOrder();}
实现类:

package com.che.api.test;import org.springframework.stereotype.Service;/** * 线下订单 * @author zhoufy * @date 2017年9月8日 下午2:25:30 */@Service("orderService")public class OrderServiceImpl implements OrderService {public void createOrder() {System.out.println("--------------线下生成订单----------");}}

Controller层:

package com.che.api.test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.che.api.action.BaseAction;/** * @author zhoufy * @date 2017年8月29日 下午6:25:52 * @see */@Controllerpublic class TestOrderAction extends BaseAction{@Autowiredprivate OrderService t;@RequestMapping(value = "/test/order", method = RequestMethod.GET)public String t(ModelMap model, String isOn) {t.createOrder();return showJsonSuccess(model);}}
以上代码启动不报错,访问“http://localhost/test/order” 可以正常访问,为什么呢,实现类我不是指定了名字吗:@Service("orderService")

为什么

@Autowiredprivate OrderService t;
通过@Autowired可以引用的到。


这是因为在使用@Autowired时,首先在容器中查询对应类型(包的路径+类名)的bean

    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

    如果查询的结果不止一个,那么@Autowired会根据名称来查找。

    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

所以我们知道原因,默认优先是根据类型(by type)进行实例注入的,所以我再怎么配置service的name都是无效的。


所以如果订单模块有多渠道(即一个OrderService有多个实现类):

package com.che.api.test;import org.springframework.stereotype.Service;/** * 网上订单 * @author zhoufy * @date 2017年9月8日 下午2:25:30 */@Service("webOrderService")public class WebOrderServiceImpl implements OrderService {public void createOrder() {System.out.println("--------------网上订单-------------");}}

则再这样使用:

@Autowiredprivate OrderService t;
就有问题了,容器启动的时候就会报错,因为OrderService有多个实现类,这时候根据类型(by type)注入实例已经行不通,就根据名称(by name)来注入实例了。


只能这样写:

@Autowiredprivate OrderService orderService;
或这样写:

@Autowiredprivate OrderService webOrderService;






参考资料:

http://www.cnblogs.com/caoyc/p/5626365.html



原创粉丝点击