分享

Bean自动装配的5种模式(autowire)

 樱花梦_张艺馨 2016-11-28
在spring中,自动装配可以指定给每一个单独的Bean,因此可以给一些Bean使用自动装配而其他的Bean不使用自动装配,通过使用自动装配,开发人员可以减少之低昂属性的需要,从而节省一些属性设定的工作,使用Bean元素的autowire属性来指定Bean定义的自动装配,共有五中模式:
byName,byType,constructor,autodetect 和 no
A:使用byName模式
     byName模式指的就是通过Bean的属性名字进行自动装配。
在spring的配置文档XML中,查找一个与将要装配的属性同样名字的Bean。
B:使用byType模式:
     byType模式指的就是如果XML中正好有一个与属性类型一样的Bean,就自动装配成这个属性。如果有多于一个这样的Bean,就抛出一个异常,指出可能不能对那个Bean使用byType的自动装配。
C:使用constructor模式
      constructor模式指的是根据构造函数的参数进行自动装配。在配置文档中,有一个id为HelloWord的Bean被设置为通过constructor自动装配,HelloWord.java包含一个构造函数方法,Spring就会根据构造函数的参数查找合适类型的Bean定义,然后用它来设置构造函数的参数的值。
D:使用autodetect模式
    autodetect模式指的是通过对Bean检查类的内部来选择constructor或者byType。如果先找到constructor就用constructor,如果没有constructor,而找到了byType就用byType。
E:使用no模式:
     no模式指的就是不使用自动装配,通过上面几个可以了解到,Bean的引用必须通过ref元素定义,这是默认的配置,在很多企业级的应用环境中不鼓励使用自动装配模式,因为它对于Bean之间的参考依赖关系不清晰。
总结:
      显式的指定依赖,如:property和constructor-arg元素,总会覆盖自动装配。正如前面已经提到过的,对于大型的应用,不鼓励使用自动装配,因为他去除了参考依赖的透明性和清晰性。
有了自动装配后,可以减少开发人员的输入工作,但是却使开发人员很难看出Bean的每个属性是否都设定完成。如何解决这个问题,spring提出了它的一些解决方案:依赖检查的4种模式。
=================练习一:使用byName模式=====================
----------------HelloWord 类----------------
package com.gc.action;
import java.util.Date;
public class HelloWord {
 private String msg;
 private Date date;
 // 无参构造方法
 public HelloWord() {
  super();
 }
 // 带参构造
 public HelloWord(String msg) {
  super();
  this.msg = msg;
 }
 
 // ---getXxx 和setXxx
 public String getMsg() {
  return msg;
 }
 public void setMsg(String msg) {
  this.msg = msg;
 }
 public Date getDate() {
  return date;
 }
 public void setDate(Date date) {
  this.date = date;
 }
}
----------------------------config.xml------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www./dtd/spring-beans.dtd">
<beans>
 <bean id="HelloWord" class="com.gc.action.HelloWord" autowire="byName" >
 <property name="msg">
  <value>zxx</value>
 </property>
 </bean>
 <bean id="date" class="java.util.Date"></bean>
</beans>
---------------------------------TestHelloWord 测试类-----------------
package com.gc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.gc.action.HelloWord;
public class TestHelloWord {
 /**
  * @param args
  */
 public static void main(String[] args) {
  ApplicationContext ac =new FileSystemXmlApplicationContext("classpath:/config.xml");
  HelloWord hw =(HelloWord) ac.getBean("HelloWord");
  System.out.println(hw.getMsg()+"----"+hw.getDate());
 }
}
============练习二:使用byType模式=====================
---------------------config.xml------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www./dtd/spring-beans.dtd">
<beans>
 <bean id="HelloWord" class="com.gc.action.HelloWord" autowire="byType">
 <property name="msg">
  <value>zxx</value>
 </property>
 </bean>
 <bean id="date" class="java.util.Date"></bean>
</beans>
==================

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多