关于@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
阅读全文
0 0
- 关于@Autowired的那些事
- 关于WAS的那些事....
- 关于foreach的那些事
- 关于成长的那些事
- 关于DOCTYPE的那些事
- 关于爱情的那些事。
- 关于http的那些事
- 关于年终奖的那些事
- 关于 DWR 的那些事
- 关于图片的那些事
- 关于补码的那些事
- 关于JSP的那些事
- 关于前端的那些事
- 关于多线程的那些事
- 关于cvScalar的那些事
- 关于cvAbsDiff的那些事
- 关于开始的那些事
- 那些关于公务员的事
- android : 空白签名与二次签名
- c语言 json使用方法
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
- POJ 1163 The Triangle
- .NET连接数据库的几种方法
- 关于@Autowired的那些事
- 提高tf代码效率
- 主席树初学总结
- appium 整理
- C#中静态和非静态方法的比较
- 下一代高性能数据库标杆POLARDB 亮相顶会VLDB2017
- c#多线程以及与主线程传值。
- MySQL设置默认存储引擎
- iOS文本实现超链接