7、Bean的自动装配

自动装配说明:

  • 自动装配是Spring满足Bean依赖的一种方式
  • Spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种自动装配的方式

  1. 在xml中显示的配置
  2. 在Java中显示配置
  3. 隐式的自动装配bean【重点】

Spring的自动装配需要从两个角度来实现,也可以说是连个操作:

  1. 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean
  2. 自动装配(autowiring):Spring自动满足bean之间的依赖,也就是我么说的IOC/DI

组件扫描和自动装配组合发挥巨大威力,使得显示的配置降到最少。

推荐不适用自动装配xml配置,而使用注解。

举个🌰:

  1. 创建两个实体类:Cat、Dag
    public class Cat {
      public void shout() {
          System.out.println("miao~");
     }
    }
    
    public class Dog {
      public void shout() {
          System.out.println("wang~");
     }
    }
    
  2. 创建一个用户类 User
    public class User {
      private Cat cat;
      private Dog dog;
      private String str;
    }
    
  3. 编写Spring配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">
    
      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat" class="com.kuang.pojo.Cat"/>
    
      <bean id="user" class="com.kuang.pojo.User">
          <property name="cat" ref="cat"/>
          <property name="dog" ref="dog"/>
          <property name="str" value="yaoyuan"/>
      </bean>
    </beans>
    
  4. 测试
    public class MyTest {
      @Test
      public void testMethodAutowire() {
          ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
          User user = (User) context.getBean("user");
          user.getCat().shout();
          user.getDog().shout();
     }
    }
    

自动装配模式:

  • autowire byName(按名称自动装配)
    由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。采用自动装配将会避免这戏错误,并且使配置简化。

    举个🌰:

    • 修改bean配置,增加一个属性 autowire=”byName”
    <bean id="user" class="com.kuang.pojo.User" autowire="byName">
       <property name="str" value="qinjiang"/>
    </bean>
    
    • 再次测试,发现结果仍可以正确输出!

    • 将 cat 的bean id 修改为 catXXX

    • 再次测试,执行时报空指针异常(java.lang.NullPointerException)。因为按byName规则找不到相对应的set方法,真正的setCat就并没有执行,自然,对象就没有被初始化,所以调用的时候就会报空指针异常错误。

    • 小结:

    当一个bean节点带有 autowire byName的属性时:

    1. ​ 将查询其类中所有的set方法名,例如setCat,获得将set去掉且转化为首字母小写的字符串,即cat
    2. 去Spring容器中寻找是否有此字符串名称id的对象
    3. 如果有,就取出注入;如果没有,报空指针错误。
  • autowire byYype(按类型自动装配)

    使用autowire byType 首先需要保证;同一类型的对象,在Spring容器中唯一。如果不唯一,会报不唯一的异常。NoUniqueBeanDefinitionException

    举个🌰:

    1. 将user的bean配置修改一下:autowire=”byYype”

    2. 测试,正常输出

    3. 在注册一个cat 的bean 对象

      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat" class="com.kuang.pojo.Cat"/>
      <bean id="cat2" class="com.kuang.pojo.Cat"/>
      
      <bean id="user" class="com.kuang.pojo.User" autowire="byType">
      <property name="str" value="qinjiang"/>
      </bean>
      
    4. 测试,报错:NoUniqueBeanDefinitionExeption

    5. 删除cat2,将cat的bean名称改掉!测试,因为是按照类型装配,所以并不会报异常,也不会影响最后的结果。甚至将id属性也去掉,也不影响结果。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇