Spring的自动装配

 我来答
机器1718
2022-11-21 · TA获得超过6833个赞
知道小有建树答主
回答量:2805
采纳率:99%
帮助的人:161万
展开全部

  采用构造函数注入 以及setter方法注入都需要写大量的XML配置文件 这时可以采用另一种方式 就是自动装 由Spring来给我们自动装配我们的Bean

  Spring提供了四种自动装配类型

   :ByName 采用这种方式时给属性自动注入值时 会根据Bean里的setXXX中的XXX去搜寻有没有id=XXX的Bean 有的话 将其自动注入 没有的话 就表示setXXX里要装入属性没有装配值

   :ByType 采用这种方式给属性自动注入值时 会根据Bean里的setXXX中的参数类型来搜寻配置文件中的Bean定义 如果发现了一个 就自动将其注入 否则如果有 个这个属性没有被装配 如果有多个 则会抛出异常

   :constructor 这种方式的注入与ByType其实没什么区别 无非是将ByType移入到了构造函数中 这种方式下 构造函数是自动注入的 在构造对象时 会自动根据构造函数的参数类型搜寻Bean 如果有一个合适的 则成功 一个没有 则失败 有多个 则会抛出异常

   :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]

  <?xml version= encoding= UTF ?>

  <beans

  xmlns= /schema/beans

  xmlns:xsi= / /XMLSchema instance

  xmlns:p= /schema/p

  xsi:schemaLocation= /schema/beans /schema/beans/spring beans xsd >

  <! 这个名字要和setXXX中的XXX保持一致 不区分大小写 >

  <bean id= website class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= byName >

  <constructor arg value= ppTest />

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>

  </beans>

  <?xml version= encoding= UTF ?>

  <beans

  xmlns= /schema/beans

  xmlns:xsi= / /XMLSchema instance

  xmlns:p= /schema/p

  xsi:schemaLocation= /schema/beans /schema/beans/spring beans xsd >

  <! 这个名字要和setXXX中的XXX保持一致 不区分大小写 >

  <bean id= website class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= byName >

  <constructor arg value= ppTest />

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>

  </beans>打印结果如下

  [java]

  工程师ppTest购买了一个苹果

  工程师ppTest购买了一个苹果

  有了第一个结果后 第二个结果也就很简单了

  ByType的测试

  修改配置文件如下

  []

  <! 这个名字 不再需要和setXXX中的XXX保持一致 >

  <bean id= web class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= byType >

  <constructor arg value= ppTest />

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>

  <! 这个名字 不再需要和setXXX中的XXX保持一致 >

  <bean id= web class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= byType >

  <constructor arg value= ppTest />

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>其他的地方可以不用修改

  Constructor自动装配 为了测试 给JavaEngineer加入一个构造函数 如下方式

  [java]

  public JavaEngineer(Website ws){

  this ws=ws;

  this name= ppTest ;

  }

  public JavaEngineer(Website ws){

  this ws=ws;

  this name= ppTest ;

  }

  再修改配置文件如下

  []

  <bean id= web class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= constructor >

  <! <constructor arg value= ppTest /> >

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>

  <bean id= web class= pp TaobaoWebsite />

  <bean id= engineer class= pp JavaEngineer autowire= constructor >

  <! <constructor arg value= ppTest /> >

  <! 这里有一个属性采用的是自动byName的方式注入的 >

  </bean>结果是一样的

lishixinzhi/Article/program/Java/ky/201311/28710

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式