spring自动注入有5中方式,分别是:

  1. byName:根据自动注入类中的对象名字,会到配置文件中找相关id或者name的bean,如果找不到则不会匹配,如果找到多个bean,则会报错。
  2. byType:根据自动注入类中的对象类型,找到配置文件中相同类型的bean,如果找到多个类型相同的bean,会报错。若没有找到相关匹配,则什么都不会发生。
  3. constructor:根据构造函数的参数进行自动匹配。如果一个类中有多个构造方法,会优先找参数最多的构造方法。如果有构造方法参数一样多,则会执行先找到那个(个人感觉)。通过构造方法注入Dog类,具体写法如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.sprintframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="EnHelloWorld" class="cn.action.EnHelloWorld">
    <constructor-arg index="0">
    <value>xwt!</value>
    </constructor-arg>
    <constructor-arg index="1">
    <value>cm!</value>
    </constructor-arg>
    <constructor-arg index="2">
    <ref bean="date"/>
    </constructor-arg>
    </bean>
    <!--id中不可以包含特殊字符。一个bean中可以没有ID,此时可以用name来代替id,
    可以有多个name,中间用‘,’隔开。id和name可以同时存在 --> <!--sigleton默认为true。当true时,会共享一个实例,每次请求返回的都是同一个。就是单例模式
    如果为false,每次请求都会返回一个新创建的实例 -->
    <bean id="ChHelloWorld" class="cn.action.HelloWorld" autowire="constructor" >
    <property name="msg">
    <value>xxxx</value>
    </property>
    <property name="date">
    <ref bean="date"/>
    </property>
    </bean>
    <bean id="date" class="java.util.Date"/>
    <bean name="dog" class="cn.model.Dog">
    <property name="name">
    <value>TT</value>
    </property>
    </bean>
    </beans>
  4. autodetect:通过对Bean检查类的内部来选择constructor或者byType。先找到哪一个就执行哪一个。使用autodetect时候在类中必须写set方法,可以不写构造方法(不写时总会有默认的无参构造)。如果没有或者有多个构造方法时候,会优先执行set方法,如果只有一个构造方法,会优先执行constructor方式(自己测试得出,可能有误)。
  5. no:不使用自动装配,bean的应用使用ref。许多企业级的应用中不推荐使用自动注入,因为自动注入会使得依赖关系不清晰。

总结:显示的依赖例如property和constructor-arg元素总会覆盖自动装配,对于大型应用来说不推荐使用自动注入。因为它去除了参考依赖的透明性和清晰性。还有值得注意的一点就是byName和 byType两种自动注入方式不能注入基本类型。

关于spring autowrie的5种方式的更多相关文章

  1. spring配置datasource三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp34 spring配置datasource三种方式 1.使用org.spri ...

  2. 使用web.xml方式加载Spring时,获取Spring context的两种方式

    使用web.xml方式加载Spring时,获取Spring context的两种方式: 1.servlet方式加载时: [web.xml] <servlet> <servlet-na ...

  3. 普通java类加入spring容器的四种方式

    今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...

  4. Spring管理事物两种方式

    Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...

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

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

  6. Spring 事务配置5种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  7. Spring注入值得2种方式:属性注入和构造注入

    Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了? 即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的 ...

  8. [转] spring事务管理几种方式

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  9. (转)spring事务管理几种方式

    转自:http://blog.csdn.net/jeamking/article/details/43982435 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置 ...

随机推荐

  1. 由link()和symlink()谈到软链接与硬链接

    任何一个文件可以有多个目录项指向其i节点.创建一个向现存文件连接的方法是使用l i n k函数. #include <unistd.h> int link(const char * e x ...

  2. MVC应用程序请求密码的功能(二)

    MVC应用程序请求密码的功能(二) 在完成<MVC应用程序请求密码的功能(一)>http://www.cnblogs.com/insus/p/3471534.html之后,如果你照着做,所 ...

  3. jquery上传控件uploadify使用备忘

    我简单修改了js和样式,效果如下 使用起来也是超简单,将文件下载并解压到你网站目录下,然后 .在使用位置插入代码 ============================= <iframe wi ...

  4. webx学习1

    webx的配置 如果想在web项目中使用webx框架,需要在web-inf/web.xml文件中进行相关的配置. 1.初始化spring容器 初始化spring容器- /web-inf/web.xml ...

  5. Mahout之(二)协同过滤推荐

    协同过滤 —— Collaborative Filtering 协同过滤简单来说就是根据目标用户的行为特征,为他发现一个兴趣相投.拥有共同经验的群体,然后根据群体的喜好来为目标用户过滤可能感兴趣的内容 ...

  6. boost解析XML方法教程

    boost库在解析XML时具有良好的性能,可操作性也很强下地址有个简单的说明 http://blog.csdn.net/luopeiyuan1990/article/details/9445691 一 ...

  7. 美团点评2017校招研发offer面经

    2017届的校招早早就结束了,抽出时间做个记录. 职位:后台开发工程师 岗位职责: 如果你热爱编程,这里给你平台用代码改变世界: 如果你乐于挑战,这里有用户和商家五花八门的需求和苛刻的系统运行环境在等 ...

  8. SpringAOP导致@Autowired依赖注入失败

    之前用springAOP做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己的情况不太符合.后来总结自己的情况发现:方 ...

  9. Java SE ——TCP协议网络编程(三)

    之前的代码中关闭了 socket 对象的输入流与输出流,但并没有关闭掉socket 对象,会造成服务器资源的浪费,应通过调用 socket 的 close() 方法来关闭当前的socket 对象. 因 ...

  10. Android第二天

    1.从看得见的活动入手 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...