8、使用注解开发

jdk1.5开始支持注解,Spring2.5开始全面支持注解。

准备工作:利用注解的方式注入属性。

  1. 在Spring配置文件中引用context文件头
    xmlns:context="http://www.springframework.org/schema/context"
    
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    
  2. 开启属性注解支持!
    <context:annotation-config/>
    
  • @Autowired
    • @Autowired是按类型自动装配的,不支持id匹配。

    • 需要导入spring-aop的包!

    • 举个🌰

    1. 将User类中的set方法去掉,使用@Autowired注解

      public class User {
        @Autowired
        private Cat cat;
        @Autowired
        private Dog dog;
        private String str;
      
        public Cat getCat() {
            return cat;
       }
        public Dog getDog() {
            return dog;
       }
        public String getStr() {
            return str;
       }
      }
      
    2. 此时配置文件的内容
      <context:annotation-config/>
      
      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat" class="com.kuang.pojo.Cat"/>
      <bean id="user" class="com.kuang.pojo.User"/>
      
    3. 测试,成功输出结果!

    4. 扩展知识点:
      @Autowired(required=false) 说明:false,对象可以为null,程序可以继续跑完,但是会抛出空指针异常(java.lang.NullPointerException);ture,对象必须存储对象,不能为null。

  • @Qualifier

    • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

    • @Qualifier不能单独使用

    • 举个🌰:

    1. 装配文件修改内容,保证类型存在对象。且名字不能为类的默认名字!

      <bean id="dog1" class="com.kuang.pojo.Dog"/>
      <bean id="dog2" class="com.kuang.pojo.Dog"/>
      <bean id="cat1" class="com.kuang.pojo.Cat"/>
      <bean id="cat2" class="com.kuang.pojo.Cat"/>
      
    2. 在没有添加@Qualifier测试,会直接报错

    3. 在属性上添加Qualifier注解

      @Autowired
      @Qualifier(value = "cat2")
      private Cat cat;
      @Autowired
      @Qualifier(value = "dog2")
      private Dog dog;
      
    4. 测试,成功输出!

  • @Resource

    • @Resource如果指定的name属性,先按该属性进行byName方式查找装配

    • 其次在进行默认的byName方式进行装配

    • 如果以上都不能正常装配,则按byType的方式自动装配

    • 若都不能张长装配,则报异常

    • 举个🌰:

    1. 实体类:

      public class User {
        //如果允许对象为null,设置required = false,默认为true
        @Resource(name = "cat2")
        private Cat cat;
        @Resource
        private Dog dog;
        private String str;
      }
      
    2. beans.xml
      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat1" class="com.kuang.pojo.Cat"/>
      <bean id="cat2" class="com.kuang.pojo.Cat"/>
      
      <bean id="user" class="com.kuang.pojo.User"/>
      
    3. 测试,结果正常

    4. 再次修改配置文件:删除cat2

      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat1" class="com.kuang.pojo.Cat"/>
      
    5. 实体类上只保留注解
      @Resource
      private Cat cat;
      @Resource
      private Dog dog;
      
    6. 测试结果正常

    7. 结论:先进行byName查找,失败、再进行byType查找,成功。

小结:

@Autowired 与 @Resource异同:

  1. @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或者是写在setter方法上。
  2. @Autowired默认按类型装配(属于Spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false),如果我们想使用名称装配,可以结合@Qualifier注解进行使用
  3. @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上,默认取字段名进行按name属性查找,如果注解写在setter方法上,默认取属性名进行装配。当找不到与名称匹配的bean时,再按照类型进行装配,但是需要主义的是,如果name属性一旦指定,就只会按照名称进行装配。

他们的作用都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName

暂无评论

发送评论 编辑评论


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