欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-16 10:46:16
...

2018.4.15

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

何为注解?

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

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

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

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

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

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

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


使用注解装配的必要操作

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

<context:annotation-config/>

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


使用@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进行一个修改:

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

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

此时运行测试类报错:

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

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

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

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

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


再次运行测试类:

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

说明Power类确实被注入了Car

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


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

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

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

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


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

在XML中将对Power的装配去掉

再次运行测试类报错

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

此时改变@Autowired属性为:

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

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

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

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

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

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

并添加另一个Power的装配

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

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

但是此时将power改为:

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

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

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

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

此时运行成功


@Autowired方式总结:

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


使用@Resource注解进行装配:

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

区别在于:

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

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

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


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

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

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

我们将:

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

进行修改:

去掉property标签

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

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

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

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

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


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

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

最初的xml文件是这样的:

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

修改后为:

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

运行结果完全一致

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


总结:

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

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

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


谢谢~