1、属性注入
    即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式。
    属性注入要求Bean提供一个默认的构造参数,并为需要注入的属性提供对应的Setter方法。Spring先调用Bean的默认构造参数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。
    需要指出的是:Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量则不做要求,例如配置文件中
<property name="brand"/>的属性配置项仅要求对应类中拥有setBrand()方法,但类中不一定要拥有brand成员变量。
    注:JavaBean的属性变量名必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求。
    配置信息:
    <bean id="car" class="com.sample.domain.Car">
        <property name="brand"><value>奔驰</value></property>
    <bean>

2、构造函数注入
    它保证一些必要的属性在Bean实例化时就得到设置,并且确保了Bean实例在实例化后就可以使用。
    1)按类型匹配入参,如果需要Car对象都必须提供brand和price的值,使用属性注入方式只能人为在配置是提供保证,而无法在语法级提供保证,而构造函数注入就可以满足这一要求。使用构造函数注入的前提是Bean必须提供带参的构造函数。
    配置信息:
    <bean id="car1" class="com.sample.domain.Car">
        <constructor-arg type="java.lang.String">
            <value>奔驰</value>
        </constructor-arg>
        <constructor-arg type="double">
            <value>20000</value>
        </constructor-arg>
    </bean>
    注:配置信息中是通过type来匹配类中的属性,与顺序无关。
    2)按索引匹配注入,由于按照类型匹配注入存在缺陷(如果构造函数中的参数类型相同,则无法正确匹配),所以提供了按照索引匹配的方法,配置信息:
    <bean id="car2" class="com.sample.domain.Car">
        <constructor-arg index="0" value="奔驰" />
        <constructor-arg index="1" value="20000"  />
    </bean>
    3)按照类型和索引综合注入,就是将1)和2)结合使用。
    配置信息:
    <bean id="car3" class="com.sample.domain.Car">
        <constructor-arg index="0" type="java.lang.String">
            <value>奔驰</value>
        </constructor-arg>
        <constructor-arg index="1" type="double">
            <value>20000</value>
        </constructor-arg>
    </bean>
    注:对于由于参数数目相同而类型不同所引起的潜在配置歧义问题,Spring容器可以正常启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,而被选择的构造函数可能并不是用户所希望的。因此,必须特别谨慎。
    4)通过自身类型反射匹配入参。如果Bean构造函数入参的类型是可辨别的(非基础数据类型且入参类型各异),由于Java反射机制可以获取构造函数入参的类型,即使构造函数注入的配置不提供类型和索引的信息,Spring依旧可以正确的完成构造函数的注入。
    配置信息:
    <bean id="boss" class="com.sample.domain.Boss">
        <constructor-arg>
            <value>John</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="car" />
        </constructor-arg>
    </bean>
    注:循环依赖问题,Spring容器能顺利实例化以构造函数注入方式配置的Bean有一个前提:Bean构造函数入参引用的对象必须已经准备就绪。由于这个机制的限制,如果相互引用的两个Bean都采用构造注入,而且都通过构造函数入参引用对方,就会发生类似线程死锁的循环依赖问题。

最新文章

  1. Nancy之基于Nancy.Hosting.Aspnet的小Demo
  2. *HDU3486 RMQ+二分
  3. doctype声明的重要性-------这绝对是ie的坑, 与angular无关, 我错怪你啦
  4. nodejs+phantomjs+七牛 实现截屏操作并上传七牛存储
  5. 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
  6. Lock的用法,为什么要用?
  7. java基础-001
  8. KeybMap 键盘映射工具更新至 V1.5(修订)
  9. C语言声明解析方法
  10. Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
  11. shell之路【第二篇】运算与文件调用
  12. Unity 学习Json篇
  13. JAVA实用案例之验证码开发
  14. jvm系列:Java GC 分析
  15. BZOJ3275Number——二分图最大权独立集
  16. $on在构造器外部添加事件$once执行一次的事件$off关闭事件
  17. LeetCode——16. 3Sum Closest
  18. Unity透明Shader
  19. Spring Boot中使用Redis小结
  20. (一)在Lingo中使用集合

热门文章

  1. ASP.NET Ajax简单的无刷新分页
  2. ANDROID内存优化——大汇总(转)
  3. Part 3 ViewData and ViewBag in mvc
  4. Swiper之滑块4
  5. vpn连接成功后,本地无法连接外网
  6. windows下部署 ISCSI存储
  7. HTML+CSS学习笔记 (15) - css样式设置小技巧
  8. 关于iOS自定义UITabBar的几种方法
  9. SVN常见问题处理
  10. nyoj_t218(Dinner)