Spring学习记录(四)——Bean的注解装配

14人阅读 评论(0) 收藏 举报
分类:

2018.4.15

仅为个人理解 不足之处欢迎指正~

何为注解?

注解也被称为元数据,它为我们在代码中添加信息提供一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据

为什么要使用注解进行装配?

在上一篇文章Spring学习记录(三)——Bean的自动装配中讲到了如byName、byType、constructor等几种Bean的自动装配方法,这些自动装配方法都可以简化配置文件的代码,增强配置文件的可读性。

使用注解进行自动装配与在XML中使用自动装配其实没有太大区别

但是使用注解装配仍然有一些独到之处:

1.使用注解进行自动装配的灵活性更高 我们可以选择性的标注某一个属性对其应用自动装配

2.使用注解进行自动装配可以进一步简化XML配置文件代码


使用注解装配的必要操作

在Spring中使用注解装配 需要在XML中加入一行代码:

<context:annotation-config/>


使用@Autowired注解进行装配:

在上一篇文章的最后 我们保有的一个例子具有如下依赖关系:

Car需要Power与Framework

Framework需要Bottom

Bottom需要Tire

具体属性及方法请参考之前文章的代码

在XML文档中我们可以清楚的通过ref看到依赖关系:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx 
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context      
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <context:annotation-config/>
      
   <bean name="car" class="com.tzy.pojo.Car" >
   		<property name="framework" ref="framework"/>
   		<property name="power" ref="power"/>
   </bean>
 
    <bean id="power" class="com.tzy.pojo.Power">
   	<property name="powernum" value="777"/>
   </bean>
   
    <bean id="framework" class="com.tzy.pojo.Framework">
    	<property name="bottom" ref="bottom"/>
    	<property name="frameworkname" value="车身A"/>
   </bean>
   
     <bean id="bottom" class="com.tzy.pojo.Bottom">
     	<property name="tire" ref="tire"/>
   </bean>
     <bean id="tire" class="com.tzy.pojo.Tire">
     	<property name="size" value="100"/>
   </bean>
	
  </beans>

现在我们将XML进行一个修改:


将Car所需的Power属性对应的property元素注视掉

此时运行测试类报错:


我们可以看到Power属性并没有注入到Car中

此时我们对Car类中的setPower()方法使用@Autowired注解:


注:使用@Autowired需要导入包org.springframework.beans.factory.annotation.Autowired


再次运行测试类:


说明Power类确实被注入了Car

当Spring发现我们对于某个Setter方法使用了@Autowired之后,Spring就会尝试对该方法进行byType方式的自动装配


现在我们进行另一个操作:

在Car类中对Power属性进行@Autowired注解 同时删除对power的set方法


再次运行测试类 得到正常结果


现在我们进行另一个操作:

在XML中将对Power的装配去掉

再次运行测试类报错

说明@Autowired没有找到匹配的Bean

此时改变@Autowired属性为:


说明该属性不一定必须装配

再次运行测试类(把测试类中对Power的输出删掉):


现在我们进行另一个操作:

将刚才删除的对Power的装配添加回来

并添加另一个Power的装配


此时运行成功 Spring选择了id为power的Bean作为装配的Bean

但是此时将power改为:


运行报错 Spring并不能决定哪一个Bean使我们所需要的

这是我们需要使用@Qualifier注解来为Spring确定一个首选项


此时运行成功


@Autowired方式总结:

  • @Autowired实际上是使用了byType方式进行自动装配
  • 它可以标记在set方法上 也可以标记在属性上 也可以标注在构造器上
  • 标住在属性上时 不再需要该属性的setter方法
  • 当有多个满足条件的Bean时 需要用@Qualifier注解


使用@Resource注解进行装配:

@Resource与@Autowired方法基本相似 使用地点也相同

区别在于:

  • 前者默认使用byName自动装配 而后者默认为byType

byName与byType方法本身类似 同时上一篇文章也有较为详细的解释

所以本文不再对@Resource方法详解


使用@Value注解进行属性值的配置:

既然我们可以使用@Autowired和@Resource进行对原来需要ref的对象的注解

我们也可以使用@Value对属性进行赋值

我们将:


进行修改:

去掉property标签

而在Power类中进行如下修改:


注意我们此时去掉了setter方法

运行结果表明777这个值注入到了Car中



使用注解进行配置的最终结果

我们现在将所有的<property>标签用注解代替

最初的xml文件是这样的:


修改后为:


运行结果完全一致



总结:

使用注解配置注入对象 可以避免xml文件越来越臃肿 同时灵活性更高

使用这种方式之后 xml仅剩下了几个Bean 而在以后将会提到将Bean也去掉的方法

这意味这我们甚至可以不使用<bean>元素


谢谢~

查看评论

spring装配bean(基于注解)

装配bean(基于注解) l  注解:就是一个类,使用@注解名称 l  开发中:使用注解 取代 xml配置文件。   l  注解使用前提,添加命名空间,让spring扫描含有注解类 ...
  • CSDN_GIA
  • CSDN_GIA
  • 2017-01-26 10:33:54
  • 559

Spring 使用注解装配Bean

Spring可以使用xml配置文件来装配bean,也可以使用注解来装配Bean 1.在上一篇文章的基础上在com.springtest包中新建Tire类,源码为: package com.spri...
  • longshengguoji
  • longshengguoji
  • 2016-01-08 23:14:20
  • 1609

Spring In Action(一):基于注解装配bean

@Component注解,将一个类作为组件 1.创建一个Spring项目,修改pom文件,添加Spring单元测试所需依赖 ...
  • lom9357bye
  • lom9357bye
  • 2017-05-29 14:25:15
  • 418

Spring IOC--Bean的装配(使用注解定义Bean)

概述 在spring中,不管是shi'yo
  • qing_soft
  • qing_soft
  • 2014-05-30 20:10:39
  • 3084

Spring Bean装配之Bean的定义及作用域的注解实现

1.概述: 2.Class扫描以及组件管理: 3.Bean的自动扫描机制:只要是该注解下面的类使用了相关的注解,就相当于为该类在上下文中创建了bean 4.如何使用过滤器自定义扫描其中使用到...
  • qq_28893679
  • qq_28893679
  • 2016-12-03 09:13:53
  • 940

Spring Bean自动装配和注解注入

问题描述 如果一个Bean需要注入很多属性,每个属性都要显示注入,就会显得很麻烦。 解决方案 让Ioc容器自动为Bean指定引用。 方法之一---在XML配置文件实现自动装配 Car.java pac...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2014-03-30 15:25:15
  • 8839

Spring(七)基于注解装配bean

说明注解在spring就是一个类,使用@+注解名称 在开发中,可以使用注解取代xml配置。更高效快捷。 如果使注解生效要在xml中配置命名空间的声明和扫描信息。 ...
  • su20145104009
  • su20145104009
  • 2016-12-08 10:33:11
  • 1370

通过Java代码装配bean【Spring 入门】

在很多时候,我们无法更改他人的源码来实现自动装配,这时,我们可以使用Java代码写配置文件进行装配。 以下是Java配置文件的写法示例:package com.yykj.soundsystem.co...
  • L_BestCoder
  • L_BestCoder
  • 2017-02-23 20:43:45
  • 496

Spring中 基于注解的装配Bean 与 基于xml的对比总结

简介注解:就是一个类,使用@注解名称 开发中:使用注解 取代 xml配置文件。这边引用他人的总结 1. @Component取代 @Component("id") 取代 ...
  • my__Sun_
  • my__Sun_
  • 2017-02-26 09:06:49
  • 182

Spring Bean装配之基于Java的容器注解说明——基于泛型的自动装配

在接口中指定T范型: 2、在实现类中指定泛型: 3、通过@Bean注解将对象注入到容器中: 4、单元测试类:...
  • qq_28893679
  • qq_28893679
  • 2016-12-05 09:38:56
  • 404
    个人资料
    等级:
    访问量: 121
    积分: 83
    排名: 110万+
    文章存档
    最新评论