1.构造方法注入

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="person" class="com.thief.demo.Person">
<constructor-arg value="1"/>
<constructor-arg value="Tom"/>
<constructor-arg ref="friend"/>
</bean> <bean id="friend" class="com.thief.demo.Friend">
<constructor-arg value="Jack"/>
</bean>
</beans>

2.setter方法注入

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="person" class="com.thief.demo.Person">
<property name="id" value="1"/>
<property name="name" value="Tom"/>
<property name="friend" ref="friend"/>
</bean> <bean id="friend" class="com.thief.demo.Friend">
<property name="name" value="Jack"/>
</bean>
</beans>

3.<property>和<constructor-arg>中可用的配置项。

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<!-- <value>:为对象注入String类型、基本数据类型和它们的包装器类型的数据 -->
<!-- 示例一 -->
<bean id="person" class="com.thief.demo.Person">
<constructor-arg>
<value>11111</value>
</constructor-arg>
<property name="id">
<value>11111</value>
</property>
</bean>
<!-- 示例二 -->
<bean id="person2" class="com.thief.demo.Person">
<constructor-arg value="11111"/>
<property name="id" value="11111"/>
</bean> <!-- <ref>:引用容器中其他的对象实例 -->
<bean id="person2" class="com.thief.demo.Person">
<constructor-arg ref="friend"/>
<property name="friend" ref="friend"/>
</bean>
<bean id="friend" class="com.thief.demo.Friend">
<property name="name" value="Jack"/>
</bean> <!-- 内部<bean>:如果所依赖的对象只有当前一个对象引用,或者某个对象定义不想其他对象通过<ref>引用到它,这时候就可以使用内部<bean> -->
<bean id="person3" class="com.thief.demo.Person">
<constructor-arg>
<bean class="com.thief.demo.Friend"/>
</constructor-arg>
</bean> <!-- <list>:<list>对应注入对象类型为java.util.List及其子类或者数组类型的依赖对象 -->
<bean id="person4" class="com.thief.demo.Person">
<property name="list">
<list>
<value>11111</value>
<ref bean="friend"/>
<bean class="com.thief.demo.Friend"/>
</list>
</property>
</bean> <!-- <set>:<set>对应注入Java Collection中类型为java.util.Set或者其子类的依赖对象 -->
<bean id="person5" class="com.thief.demo.Person">
<property name="set">
<set>
<value>11111</value>
<ref bean="friend"/>
<bean class="com.thief.demo.Friend"/>
</set>
</property>
</bean> <!-- <map>:<map>对应注入对象类型为java.util.Map或者其子类类型的依赖对象 -->
<bean id="person6" class="com.thief.demo.Person">
<property name="map">
<map>
<entry key="id">
<value>11111</value>
</entry>
<entry key="friend">
<ref bean="friend"/>
</entry>
</map>
</property>
</bean> <!-- <props>: <props>对应配置类型为java.util.Properties的对象依赖 -->
<bean id="person7" class="com.thief.demo.Person">
<property name="props">
<props>
<prop key="id">11111</prop>
<prop key="name">Tom</prop>
</props>
</property>
</bean>
</beans>

4.autowire

除了可以通过配置明确指定bean之间的依赖关系,Spring还提供了根据bean定义的某些特点将相互依赖的某些bean直接自动绑定的功能。通过bean的autowire属性,可以指定当前bean定义采用某种类型的自动绑定模式。这样就无需手工明确指定该bean定义相关的依赖关系,从而也可免去一些手工输入的工作量。

Spring提供了5种自动绑定模式,即no,byName,byType,constructor和autodetect。

• no

容器默认的自动绑定模式,也就是不采用任何形式的自动绑定,完全依赖手工明确配置各个bean之间的依赖关系。

• byName

按照类中声明的实例变量的名称,与XML配置文件中声明的bean定义的beanName的值进行匹配,相匹配的bean定义将被自动绑定到当前实例变量上。

• byType

如果指定当前bean定义的autowire模式为byType,那么,容器会根据当前bean定义类型,分析其相应的依赖对象类型,然后到容器所管理的所有bean定义中寻找与依赖对象类型相同的bean定义,然后将找到的符合条件的bean自动绑定到当前bean定义。

如果找不到,则不做设置。但如果找到多个,容器无法解决“该选用哪一个”的问题,需要你对该问题进行修正。所以,byType只能保证,在容器中只存在一个符合条件的依赖对象的时候才会发挥最大的作用。

• constructor

byName和byType类型的自动绑定模式是针对property的自动绑定,而constructor类型则是针对构造方法参数的类型而进行的自动绑定,它同样是byType类型的绑定模式。不过,constructor是匹配构造方法的参数类型,而不是实例属性的类型。与byType模式类似,如果找到不止一个符合条件的bean定义,那么,容器会返回错误。

• autodetect

这中模式是byType和constructor的结合体,如果对象拥有默认无参数的构造方法,容器会优先考虑byType的自动绑定模式。否则,会使用constructor模式,当然,如果通过构造方法注入绑定后还有其他属性没有绑定,容器也会使用byType对剩余的对象属性进行绑定。

spring 构造方法注入和setter方法注入的XML表达的更多相关文章

  1. SpringBoot 构造器注入、Setter方法注入和Field注入对比

    0. 引入 今天在看项目代码的时候发现在依赖注入的时候使用了构造器注入,之前使用过 Field 注入和 Setter 方法注入,对构造器注入不是很了解.经过查阅资料看到,Spring 推荐使用构造器注 ...

  2. spring构造函数注入、setter方法注入和接口注入

    Spring开发指南中所说的三种注入方式: Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA { private InterfaceB clz ...

  3. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?

    你两种依赖方式都可以使用,构造器注入和Setter方法注入.最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖.

  4. Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入

    所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中. 使用构造器注入   1 2 3 4 <constructor-arg index=“0” type=“java.lang. ...

  5. spring setter方法注入

    <bean id="dao" class="Dao"></bean> <bean id="service" c ...

  6. bean的装配方式(注入方式,构造注入,setter属性注入)

    bean的装配方式有两种,构造注入和setter属性注入. public class User { private String username; private String password; ...

  7. id、name、setter方法注入、构造方法注入、工厂方法注入、注解注入、方法注入、方法替换、Web作用域、普通bean引用Web作用域的bean

    spring IoC的id和name id的命名需要满足XML对id的命名规范,必须以字母开始,后面可以是字母.数字.连字符.下画线.句号.冒号等等号,但逗号和空格是非法的.如果用户确实希望用一些特殊 ...

  8. Spring揭秘 读书笔记 四----方法注入

    我们知道,拥有prototype类型scope的bean,在请求方每次向容器请求该类型对象的时候,容器都会返回一个全新的该对象实例. 我们看下面的例子: public class MockNewsPe ...

  9. spring依赖注入之构造函数注入,set方法注入

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

随机推荐

  1. perl一次读取多行文本的策略

    在处理文本时,经常遇到这种情况:就是我们须要把两行文本做一个比較,然后选择性输出. 而在while(<FILEHAND>){do something}程序块中默认仅仅能一次读取一行.笔者在 ...

  2. mipmap一

    讲一下mipmap 生成的时候 指定texture 的mipmaplevel 8 然后memory自动就会那么大的 画的时候要在lineraspace(因为我是gpucopy所以不涉及这个问题 可能) ...

  3. nginx简单实现反向代理和静态资源服务器

    1修改hosts文件 127.0.0.1 www.test1.com 127.0.0.1 www.test2.com 127.0.0.1 static.com 2配置tomcat的server.xml ...

  4. Java学习之泛型和异常

    泛型 1,设计原则或目的:只要代码在编译的时候没有错误,就不会抛异常.  2,泛型通配符  :类型通配符一般是使用 ? 代替具体的类型实参.注意了,此处是类型实参,而不是类型形参!相当于(父类作用)L ...

  5. STL学习笔记(数值算法)

    运用数值算法之前必须先加入头文件<numeric> 加工运算后产生结果 1.对序列进行某种运算 T accumulate(InputIterator beg,InputIterator e ...

  6. ExtJs的Ext.grid.GridPanel不能选择复制表格中的内容解决方案

    今天遇到grid复制的问题,在网上找到了一个解决办法,只需改下CSS和JS,给大家分享一下: 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dy_paradise/a ...

  7. git个人使用总结(命令版)

    一.基础命令 快照类操作:add.status.diff.commit.reset.rm.mv 分支类基本操作:branch.checkout.log.stash 分享及更新项目基本操作:pull.p ...

  8. 正则表达式 判断IP 数字

    1.正则表达式 public static bool checkIP(string strIP) { //string regex = @"^(2[0-4]\d | 25[0-5] | [0 ...

  9. python 读写数据

    开源标准数据集 —— mnist(手写字符识别) 下载地址:mnist.pkl.gz 1. 使用 python 读取和解析 mnist.pkl.gz import pickle import gzip ...

  10. lower_bound() 与 upper_bound()

    1. lower_bound() lower_bound()是泛型算法,在使用时,需要先将序列进行排序: 作用:  函数lower_bound()在first和last中的前闭后开区间进行二分查找,返 ...