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>元素
谢谢~
上一篇: go写一个简单的概率算法
下一篇: 概率上机作业1