spring的注入
1 可能遇到的问题:
异常信息 NoSuchBeanDefinitionException: No matching bean of type [...]或是NoSuchBeanDefinitionException: No unique bean of type [...] 这两者具体区别暂不深究,但究其原因都是因为找不到某类型的bean,后面再讲。
异常信息 expected single matching bean but found 2,很好理解,之前是找不到,现在是找到不止一个,spring不知道该怎么办了。
...待补充
2 注入和注出
这是未经考证的说法,我认为区分为这两者之后比较容易理解注入问题。严格来讲注入和注出关系被以各种方式描述在了beanDefinition里面,类似于消费者和生产者。他们的行为往往发生在spring容器初始化时,除非指定为了prototype。
排查问题时从这两个角度来看,注入是不是不对,注出是不是不对。
2.1 常见的注出方式
1. 我们必须要了解最简单直接的方式,即
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" />
就这种方式而言也另有工厂方法方式,其中还分为静态工厂以及实例工厂,不细讲
2. 在spring后续引入注解后,在对类施加@Service @Component @Controller @Repository这四种注解(他们在注出上作用一样),并配置包扫描:
<context:component-scan base-package="com.mypackage"/>
同时配置注解的类要在包扫面的路径之内。注解注出的bean默认的id和name是类名第一个字母改为小写
2.2 常见的注入方式
注入指的是通知spring你的bean对哪些bean拥有实例或称依赖,需要spring做“填充”。
2.2.1.显式注入:setter注入(还有constructor注入,与此类似):
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref>dataSource</ref>
</property>
</bean>
setter注入需要有对应的setter方法,请注意驼峰命名,否则抛出找不到setter的异常。constructor注入需要对应的构造方法。
2.2.2.自动装配
default-autowire="byName/byType"
特别注意,这个东西和@autowire没有半毛钱关系,一般出现在spring文件头,即<beans>标签内。这个设置会智能的扫描每个bean有哪些setter方法,并添加类似第一条的property。也就是说有此配置后就不需要上面的<property></property>标签了。不同之处在于显式配置可自由指定所需的bean,default-autowire只有根据名称、类型来匹配。
2.2.3.注解注入
首先要启动注解注入,主要由AutowiredAnnotationBeanPostProcessor、 CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及requiredAnnotationBeanPostProcessor这四个类来负责检测注解并实现注入的,所以spring容器需要得到这几个类的bean,这里有两种方式:
- 显式
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
使用到哪个注解就注册对应的PostProcessor,假如使用autowired,就用这个就可以了。其他的具体对应关系请自行研究。
- 懒汉式
<context:annotation-config />
这个配置将隐式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及equiredAnnotationBeanPostProcessor这 4 个 BeanPostProcessor。而上述的 component-scan该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。这是因为前者默认包含着这样一个属性:annotation-config="true",假如我们将其显式指定为false,那么就要另外添加<context:annotation-config/>配置。
启动注解注入之后,当然要使用注解:
@autowired
@autowired 注入的注解,默认是按type注入,但可以用@Qualifier("abc")改为byname。
@Autowired
setAbc(@Qualifier("abc")Abc abc)
事实证明,写在方法前面的autowire可以无视方法名,如
@Autowired
public void aaa(QuestionMarkDao questionMarkDao) {
super.setBaseDao(questionMarkDao);
}
这样,和@postConstruct注解就相对比较接近了,不同在于前者可以带参数,参数会自动从容器中找对应的bean
@Autowired @Qualifier("abc")
MyClass myClass;
@Resource
按name来注入的注解,找不到的时候尝试按type注入。byName指的是优先byName,如果找不到与属性名称相同的bean时再按照type进行查找。这里就会出现上面讲的两个异常了,第一种是没找到相同名字、也没有相同类型( No unique bean of type );第二种是有相同名字,但是类型不同(……);第三种是没有找到相同名字,但是相同类型的有多个( expected single matching bean but found 2)
@Resource
MyClass myClass @Resource(name="otherName")
MyClass myClass
other stuff:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />
需要引入xmlns以及schemaLocation
value和ref的区别:
前者是注入字符串值,后者注入容器内的bean(id为ref值的bean)
spring的注入的更多相关文章
- Spring自动注入properties文件
实现spring 自动注入属性文件中的key-value. 1.在applicationContext.xml配置文件中,引入<util />命名空间. xmlns:util=" ...
- spring 属性注入
Spring的核心技术室依赖注入,下面是依赖注入之属性注入的实现过程,牛刀小试,请看效果. 1.首先添加Spring.Web引用.本例中是使用分层思想来演示的,下面是项目的结构和UserModel类的 ...
- spring 多线程 注入 服务层 问题
在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://h ...
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Spring的注入问题
作下笔记,Spring的注入问题[多个实例问题] 解决方案如下: package student.life.support.platform.service.impl; import javax.an ...
- Spring依赖注入(IOC)那些事
小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- Spring 依赖注入,在Main方法中取得Spring控制的实例
Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
随机推荐
- Spring Scope:Web项目中如何安全使用有状态的Bean对象?
Web系统是最常见的Java应用系统之一,现在流行的Web项目多使用ssm或ssh框架,使用spring进行bean的管理,这为我们编写web项目带来了很多方便,通常,我们的controler层使用注 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。
一.博客系统进度回顾 目前已经完成了,前台展示,以及后台发布的功能,最近都在做这个,其实我在国庆的时候就可以弄完的,但是每天自己弄,突然最后国庆2天,连电脑都不想碰,所以就一直拖着,上一篇写了前端实现 ...
- 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache
虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...
- EF架构~EF异步改造之路~让DbContextRepository去实现异步接口
回到目录 返回异步与并行目录 上一讲中,我们定义了三个异步操作接口,这回我们将对它进行实现,而有一个基础知识需要大家清楚,那就是实现接口的方式,一般我们使用默认的方式(隐式实现),这种方法实现的接口方 ...
- 微信公众平台自动回复wechatlib.jar的生成及wechatlib解析
微信公众平台出来有一段时日了,官方提供的自动回复的接口调用大致是这么些类型(text/image/location/link),每个项目都如此拷贝代码,在笔者看来比较麻烦,今天乘着点闲暇的时间特意将这 ...
- Lind.DDD.Repositories.Redis层介绍
回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席 ...
- JdbcTemplate进行查询
1.jdbcTemplate.queryForInt() 和 jdbcTemplate.queryForLong() 例如:下面使用queryForInt()方法传回user表中的记录数: jdbcT ...
- 利用SCORE法则来总结一次偷懒的单元测试过程
最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家. S:背景 代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到 ...
- linux下tomcat自启动设置
1.进入/etc/init.d 2.新建文件tomcat,内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-starts tomca ...