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。

  使用方法: 
    1.写在setter中如:
  

     @Autowired
   setAbc(@Qualifier("abc")Abc abc)

  事实证明,写在方法前面的autowire可以无视方法名,如

     @Autowired
public void aaa(QuestionMarkDao questionMarkDao) {
super.setBaseDao(questionMarkDao);
}

  这样,和@postConstruct注解就相对比较接近了,不同在于前者可以带参数,参数会自动从容器中找对应的bean

   

2.也可写在变量前,可以省略setter,如 
  

   @Autowired @Qualifier("abc")
  MyClass myClass;

@Resource 

  按name来注入的注解,找不到的时候尝试按type注入。byName指的是优先byName,如果找不到与属性名称相同的bean时再按照type进行查找。这里就会出现上面讲的两个异常了,第一种是没找到相同名字、也没有相同类型( No unique bean of type );第二种是有相同名字,但是类型不同(……);第三种是没有找到相同名字,但是相同类型的有多个( expected single matching bean but found 2)

  小细节,在子类中需要注入基类的某个属性a还不能用resource注入,因为假如使用子类,那么没有问题使用的是子类版本的属性a,假如代码运行到基类的代码,调用到a属性时,这时候使用的是基类的a,注入就没有意义了,容易nullpointer。所以在继承关系中有属性隐藏的时候,最好使用显式的注入方式,选择只注入基类,也可以只注入子类,或是都注入。
 
  使用方法(可以省略setter):

@Resource
MyClass myClass @Resource(name="otherName")
MyClass myClass

  


other stuff:

 
同id的bean:
  两个bean拥有相同的id:在同一个文件中会报错的。但是如果通过<import,来自于不同的xml文件不会报错,spring会根据加载顺序来选择后一个bean,第一个bean直接无视。
不同spring文件的default-autowire:
  是否会互相影响,我还没研究过,有人知道请告诉我
p标签:
  p标签就是property
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />

  需要引入xmlns以及schemaLocation

value和ref的区别:

  前者是注入字符串值,后者注入容器内的bean(id为ref值的bean)

 

spring的注入的更多相关文章

  1. Spring自动注入properties文件

    实现spring 自动注入属性文件中的key-value. 1.在applicationContext.xml配置文件中,引入<util />命名空间. xmlns:util=" ...

  2. spring 属性注入

    Spring的核心技术室依赖注入,下面是依赖注入之属性注入的实现过程,牛刀小试,请看效果. 1.首先添加Spring.Web引用.本例中是使用分层思想来演示的,下面是项目的结构和UserModel类的 ...

  3. spring 多线程 注入 服务层 问题

    在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://h ...

  4. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  5. Spring的注入问题

    作下笔记,Spring的注入问题[多个实例问题] 解决方案如下: package student.life.support.platform.service.impl; import javax.an ...

  6. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  7. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  8. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  9. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  10. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

随机推荐

  1. 特性(C#)

    特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签,可以为程序集.类型,以及类型内部的各种成员添加扩展信息,用于表示一些附加信息.您可 ...

  2. jquery仿搜狐投票动画代码

    体验效果:http://hovertree.com/texiao/jquery/21/ 这是一款基于jquery实现的仿搜狐投票动画特效源码,运行该源码可见VS图标首先出现在中间位置,紧接着随着投票比 ...

  3. Devexpress Gantt 应用

    甘特图属于甘特系列浏览次数(也称为时间或时间轴图表).此视图显示横条沿时间轴.每个条形代表一个单独的事件的开始和结束的值, 因此,这些图是用来跟踪各种活动的时间范围内(例如计划,利用各种资源,审查该项 ...

  4. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

  5. placeholder的样式设置

    在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. ::-webkit-input-placeholder ...

  6. liunx命令

    关机 (系统的关机.重启以及登出 ) shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minute ...

  7. ABP之动态WebAPI(一)

    ABP的动态WebApi实现了直接对服务层的调用(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 调用没有跨过HttpHan ...

  8. entityframework学习笔记--001

    最近想重新好好学习一下entityframework,于是在院子里找到了一篇不错的博客.下面把学习的过程记录下来,方便以后复习. 学习过程参考大神的博客:http://www.cnblogs.com/ ...

  9. 使用HTML 和CSS 开发商业站点

    第一章HTML 基础1.html 的基本结构?解析:2.HTML 全称Hyper Text Markup Language(超文本标记语言)扩展XML:Extendsible Markup Langu ...

  10. web项目知识整理

    一.div居中 1.margin:auto 2.left:50%:margin-left:div宽度的一半 二.一般处理程序操作session 引using System.Web.SessionSta ...