zoukankan      html  css  js  c++  java
  • 关于spring autowrie的5种方式

    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两种自动注入方式不能注入基本类型。

  • 相关阅读:
    Error 1313: RETURN is only allowed in a FUNCTION SQL Statement
    Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got
    Error Code: 1305. FUNCTION student.rand_string does not exist
    Error Code: 1630. FUNCTION rand.string does not exist
    初入职场少年时,谁人不犯错?——北漂18年(6)
    错误代码: 1064
    第30章 表维护
    消息系统kafka及其变种Jafka、Metamorphosis (MetaQ)
    KAFKA分布式消息系统
    FineReport的JS编辑框和URL地址栏语法简介
  • 原文地址:https://www.cnblogs.com/cmxwt/p/6278611.html
Copyright © 2011-2022 走看看