[Spring实战系列](13)使用注解自动装配
1. 简介
从Spring2.5开始,我们就可以使用注解的自动装配方式装配Spring Bean的属性。使用注解自动装配方式与在XML中使用autowire属性自动装配没有太大区别。那为啥还要研发出这样一种装配方式?肯定有它独特的地方: 使用注解自动装配方式允许更细粒度的自动装配,我们可以选择性的标注某一个属性对其应用自动装配 。
2. 启用注解装配
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
3. 使用@Autowired
@Autowired
public void setSchool(School school) {
this.school = school;
}
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value="yoona"/>
<property name="age" value="24"/>
</bean>
<bean id = "xidianSchool" class = "com.sjf.bean.School">
<property name="name" value="西安电子科技大学"/>
<property name="location" value="西安"/>
</bean>
</beans>
name:yoona age:24 school:西安电子科技大学[西安] |
使用了@Autowired注解时,Spring就会尝试对该方法执行byType自动装配。 |
使用@Autowired注解不只可以使用它标注setter方法,还可以标注需要自动装配Bean引用的任意方法。甚至是构造器,@Autowired注解表示当创建Bean时,即使Spring XML文件中没有使用<constructor-arg>元素配置Bean,该构造器也需要进行自动装配。Spring会从所有满足装配条件的构造器中选择入参最多的那个构造器。还可以标注属性,并可以删除setter方法。 |
@Autowired
public void setSchool(School school) {
this.school = school;
}
@Autowired
private School school;
@Autowired
public void assemblySchool(School school) {
this.school = school;
}
@Autowired
public Student(School school) {
this.school = school;
}
应用中必须只能有一个Bean适合装配到@Autowired注解所标注的属性或者参数中。如果没有匹配的Bean,或者存在多个匹配的Bean,@Autowired注解就会遇到一些麻烦。 |
3.1 没有匹配的Bean
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException :
No qualifying bean of type [com.sjf.bean.School] found for dependency: expected
at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
raiseNoSuchBeanDefinitionException( DefaultListableBeanFactory.java:1373 )
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
doResolveDependency( DefaultListableBeanFactory.java:1119 )
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
resolveDependency( DefaultListableBeanFactory.java:1014 )
at org.springframework.beans.factory.annotation.
AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject( AutowiredAnnotationBeanPostProcessor.java:618 )
... 15 more
|
@Autowired(required = false)
public void setSchool(School school) {
this.school = school;
}
required属性可以用于@Autowired注解所使用的任意地方。但是当使用构造器装配时,只有一个构造器可以将@Autowired的required属性设置true。其他使用@Autowired注解所标注的构造器只能将required属性设置为false。 |
3.2 多个匹配的Bean
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value="yoona"/>
<property name="age" value="24"/>
</bean>
<bean id = "xidianSchool" class = "com.sjf.bean.School">
<property name="name" value="西安电子科技大学"/>
<property name="location" value="西安"/>
</bean>
<bean id = "shandaSchool" class = "com.sjf.bean.School">
<property name="name" value="山东大学"/>
<property name="location" value="山东"/>
</bean>
</beans>
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException :
No qualifying bean of type [com.sjf.bean.School] is defined: expected single matching bean but found 2: xidianSchool,shandaSchool
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency( DefaultListableBeanFactory.java:1126 )
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency( DefaultListableBeanFactory.java:1014 )
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.
inject( AutowiredAnnotationBeanPostProcessor.java:618 )
... 15 more
|
@Autowired
@Qualifier("shandaSchool")
public void setSchool(School school) {
this.school = school;
}
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value="yoona"/>
<property name="age" value="24"/>
</bean>
<bean id = "xidianSchool" class = "com.sjf.bean.School">
<property name="name" value="西安电子科技大学"/>
<property name="location" value="西安"/>
<qualifier value="ShanXi"/>
</bean>
<bean id = "shandaSchool" class = "com.sjf.bean.School">
<property name="name" value="山东大学"/>
<property name="location" value="山东"/>
<qualifier value="ShanDong"/>
</bean>
</beans>
@Autowired
@Qualifier("ShanXi")
public void setSchool(School school) {
this.school = school;
}
name:yoona age:24 school:西安电子科技大学[西安] |
@Value("yoona")
private String name;
@Value("#{systemProperties.myFavoriteSong}")
private String song;
参考:《Spring实战》
[Spring实战系列](13)使用注解自动装配相关推荐
- [Spring实战系列](12)Bean的自动装配
Spring提供了4种各具特色的自动装配策略: 类型 说明 no 默认方式,Bean的引用必须通过XML文件中的</ref>元素或者ref属性手动设定. byName 把与Bean的属性具 ...
- Spring—自动装配与注解自动装配
目录 自动装配 Spring支持5种自动装配模式 演示自动装配 1. no 默认装配方式 2.使用 byName 自动装配 3.使用 byType 自动装配 4.使用 constructor 自动装配 ...
- 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?
写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...
- [Spring实战系列](18)注解切面
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50659876 使用注解来创建切面是Aspec ...
- [Spring实战系列](11)SpEL使用表达式装配
到目前为止,我们为Bean 的属性和构造器参数装配的所有东西都是在Spring 的XML 配置文件中静态定义的. <bean id = "yoona" class = &qu ...
- [Spring实战系列](6)配置Spring IOC容器的Bean
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50619900 1. 简介 Spring提供了 ...
- [Spring实战系列](8)Spring注入方式之setter注入
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50631178 通常,JavaBean 的属性 ...
- Bean用@Autowire注解自动装配
举例:一个人有两只宠物(猫和狗) 实体类 public class Cat {public void shout(){System.out.println("喵~");} } pu ...
- Spring中使用byType实现Beans自动装配
以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byType.html: 此 ...
最新文章
- 竞赛专题(四)特征工程-竞赛中的必杀技
- C# 系统应用之注册表使用详解
- Java12题:发奖金问题
- Redis灵魂14问?真香
- python微信聊天机器人源码_8.【代码】微信聊天机器人(API的应用) - Python网络爬虫实战...
- 牛客多校第五场 A digits 2 签到
- Win系统 - 如何解决 Windows + P 键无法切换双显复制模式?
- WinRAR4.11激活
- 读书随笔(6)密码恢复
- vc 星号密码查看方法
- 海康威视接口在线调试
- Agronomy|3.9分JCR1区征稿/37天见刊-宏基因组解析农业微生物组专刊(刘永鑫/于鹏)...
- 电脑操作系统 GUI 38年进化史
- CTF web总结(入门)
- 移动数据不如移动计算?
- Web开发实用浏览器(工具)插件
- C++11新特性精讲(多线程除外)
- 微信小程序_4,WXSS模板样式
- 比尔盖茨宣布其将在两年后退休!!!
- 关于中兴软创长沙研发中心的面试
热门文章
- C# winfrom中Flash播放使用axShockwaveFlash控件设置透明XP出现白色背景解决办法,仿QQ魔法表情效果...
- 快速绘制流程图「GitHub 热点速览 v.22.47」
- Web项目中诡异的java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout问题解决
- Google以9000万美元了结点击欺诈案
- 用PPT制作圣诞节贺卡的方法
- Python爬虫403错误的解决方案
- 一步一步教你开发《松鼠推箱子》手机游戏
- dj java实现_躁!DJ 风格 Java 桌面音乐播放器
- [电源系列]一、BUCK与BOOST电路的占空比计算
- 蓝牙网状网络的基本原理及应用开发