tzy1997

但行好事 莫问前程

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

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>元素


谢谢~

阅读更多
个人分类: JavaWeb Spring
上一篇Spring学习记录(三)——Bean的自动装配
下一篇Spring学习记录(五)——初步体验AOP
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭