疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Spring的自动装配


 

       采用构造函数注入,以及setter方法注入都需要写大量的XML配置文件,这时可以采用另一种方式,就是自动装,由Spring来给我们自动装配我们的Bean.
 
  Spring提供了四种自动装配类型
 
  1:ByName 采用这种方式时给属性自动注入值时,会根据Bean里的setXXX中的XXX去搜寻有没有id=XXX的Bean,有的话,将其自动注入,没有的话,就表示setXXX里要装入属性没有装配值。
 
  2:ByType 采用这种方式给属性自动注入值时,会根据Bean里的setXXX中的参数类型来搜寻配置文件中的Bean定义,如果发现了一个,就自动将其注入,否则如果有0个这个属性没有被装配,如果有多个,则会抛出异常。
 
  3:constructor 这种方式的注入与ByType其实没什么区别,无非是将ByType移入到了构造函数中,这种方式下,构造函数是自动注入的,在构造对象时,会自动根据构造函数的参数类型搜寻Bean,如果有一个合适的,则成功,一个没有,则失败,有多个,则会抛出异常。
 
  4:autodetect 自动检测方式,会采用如下流程,先按照constructor方式,再按照ByType方式。
 
  例子源代码如下
 
  例子一个Java工程师从一个网站上买东本
 
  一个普通的JavaBean
 
  [java]
 
  interface Engineer{
 
  Object buyApple();
 
  }
 
  public class JavaEngineer implements Engineer{
 
  private String name;
 
  private Website ws;
 
  public JavaEngineer(String name){
 
  this.name=name;
 
  }
 
  public void setWebsite(Website ws){
 
  this.ws=ws;
 
  }
 
  @Override
 
  public String toString() {
 
  // TODO Auto-generated method stub
 
  return super.toString();
 
  }
 
  public Object buyApple(){
 
  System.out.print("工程师"+name);
 
  return ws.buyApple();
 
  }
 
  }
 
  interface Engineer{
 
  Object buyApple();
 
  }
 
  public class JavaEngineer implements Engineer{
 
  private String name;
 
  private Website ws;
 
  public JavaEngineer(String name){
 
  this.name=name;
 
  }
 
  public void setWebsite(Website ws){
 
  this.ws=ws;
 
  }
 
  @Override
 
  public String toString() {
 
  // TODO Auto-generated method stub
 
  return super.toString();
 
  }
 
  public Object buyApple(){
 
  System.out.print("工程师"+name);
 
  return ws.buyApple();
 
  }
 
  }
 
这个网站假设是淘宝网:
 
  [java]
 
  interface Website{
 
  Object buyApple();
 
  }
 
  public class TaobaoWebsite implements Website {
 
  public TaobaoWebsite()
 
  {
 
  }
 
  public Object buyApple()
 
  {
 
  System.out.println("购买了一个苹果");
 
  return new Object();
 
  }
 
  }
 
  interface Website{
 
  Object buyApple();
 
  }
 
  public class TaobaoWebsite implements Website {
 
  public TaobaoWebsite()
 
  {
 
  }
 
  public Object buyApple()
 
  {
 
  System.out.println("购买了一个苹果");
 
  return new Object();
 
  }
 
  }则采用自动装配的ByName方式,的配置文件如下:
 
  [java]