annotation-config自动装配

本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7716678.html

解决问题

通过spring XML配置文件,实现类对象之间松耦合

前提条件

使用的bean必须在spring容器中已注册过

内容说明

1、 使用@Autowired注解自动装配时,需在XML配置文件中引入 <context:annotation-config/>;

2、 存在多个bean满足装配属性,需用@Qualifier指定唯一的bean,否则会报异常;

Guitar和Saxophone都实现了Instrument接口,Instrumentalist存在一个属性类型为Instrument,

所以Instrumentalist满足装配Instrument属性的bean就有 Guitar和Saxophone,所以必须指定唯一的bean;

3、 bean 的id不指定时,默认类名小写;

例如<bean class="com.spring.example.annotation.config.Guitar"/> 因为id没有指明,所以默认为guitar;

应用实例(包名:com.spring.example.annotation.config)

spring配置文件 annotation-config.xml 如下:

 <?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"> <!--&lt;!&ndash;使用基于注解自动装配 @Autowired @Inject @Resource&ndash;&gt;-->
<context:annotation-config/> <!--限定歧义性的依赖,使用@Autowired注解自动装配,满足装配的多个bean,
可以通过@Qualifier指定来缩小范围 默认byType
Guitar和Saxophone都实现了Instrument,所以有多个bean满足Instrumentalist注入属性,
需要指定唯一bean,用@Qualifier("guitar")指定,否则会报异常
--> <bean id ="guitar" class="com.spring.example.annotation.config.Guitar"/>
<bean id ="saxophone" class="com.spring.example.annotation.config.Saxophone"/>
<bean id ="kenny"
class="com.spring.example.annotation.config.Instrumentalist">
<property name="song" value="Jingle Bells3" />
</bean> </beans>

Instrument接口代码

public interface Instrument {
void play();
}

Guitar实现接口Instrument代码

public class Guitar implements Instrument {
@Override
public void play() {
System.out.println("Guitar....");
}
}

Saxophone实现接口Instrument代码

public class Saxophone implements Instrument {
@Override
public void play() {
System.out.println("Saxophone ......");
}
}

Performer接口代码

public interface Performer {

    void perform();
}

Instrumentalist实现接口Performer代码

public class Instrumentalist implements Performer {

    public Instrumentalist(){}
@Value("Yesterday Once more !") //song 初始化值
private String song; // @Autowired 可以装配属性、方法、构造函数,只要类型相同(这里是Instrument类型)
@Autowired
@Qualifier("guitar") //spring容器中有多个bean满足要求,需要指定bean
private Instrument instrument; public void setSong(String song) {
this.song = song;
} public void setInstrument(Instrument instrument){
this.instrument = instrument ;
} @Override
public void perform() {
System.out.println("Playing "+ song + " : ");
instrument.play();
} }

测试代码

public class Driver extends Application {

    public static void main(String[] args) {
launch(args);
} @Override
public void start(Stage primaryStage) {
try { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/annotation-config.xml");
Performer performer = (Performer) ctx.getBean("kenny");
performer.perform(); }catch (Exception e){
e.printStackTrace();
}
}
}

运行结果

总结

annotation-config下@Autowired自动装配自然也有其优缺点:

优点:实现类对象之间松耦合,

缺点:需要在spring配置文件中需提前手动指明bean,增加XML文件繁琐冗余性;

在业务逻辑开发中不能将业务类自动注入spring容器,遇到业务类的更改,配置文件也不得不更改,增加出错概率;

component-scan能解决此问题,会在下节讲述;

应用场景

调用第三方接口,装配注入相应实例bean;

本文描述可能有不对或不全之处,欢迎大家吐槽!

不要让懒惰占据你的大脑,不要让妥协拖垮你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下。

spring框架应用系列一:annotation-config自动装配的更多相关文章

  1. Spring框架学习笔记(5)——自动装配

    1.通过bean标签的autowire属性可以实现bean属性的自动装配. 创建一个新的Spring配置文件beans-autowire.xml,这里我们配置了3个bean,Address.Car.P ...

  2. 模仿 spring IOC Annotation版自动装配

    spring 有两大核心 IOC和AOP.  IOC (inversion of control) 译为 控制反转,也可以称为 依赖注入 ; AOP(Aspect Oriented Programmi ...

  3. 大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?

    大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配?   很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题, ...

  4. 使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”

    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”. 原 ...

  5. spring框架应用系列二:component-scan自动扫描注册装配

    component-scan自动扫描注册装配 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html ...

  6. Spring系列7:`autowire`自动装配怎么玩

    回顾 前几篇我们介绍各种依赖依赖注入,都是显式指定的,配置明确但同时也有些繁杂和重复."很多发明的出发点,都是为了偷懒,懒人是推动社会进步的原动力".Spring 提供了自动注入依 ...

  7. 使用Spring的JavaConfig 和 @Autowired注解与自动装配

    1 JavaConfig  配置方法 之前我们都是在xml文件中定义bean的,比如: 1 2 3 4 5 6 7 8 <beans xmlns="http://www.springf ...

  8. Spring学习记录(十一)---使用注解和自动装配

    Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入c ...

  9. Spring 框架 详解 (四)------IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...

随机推荐

  1. 201521123013 《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 Q1. MySQL数据库基本操作 1.1 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 1.2 在自己建立的数据库上执行常见SQ ...

  2. 201521123062《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  3. 201521123018 《Java程序设计》第12周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.da ...

  4. linux 环境NTP配置与开机自启动(转)

    Linux下配置NTP服务器一.前言:    默认NTP服务端口:    UDP/123    本文配置的NTP工作模式:    使用client/server方式,该方式适用于一台时间服务器接收上层 ...

  5. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  6. Java通过链表实现栈

    class LinkedStack<T> { private Node top; private int size; /** * 初始化栈 */ public LinkedStack() ...

  7. Promise小书(长文)

    promise基础 Promise是异步编程的一种解决方案.ES6 Promise的规范来源于Promises/A+社区,它有很多版本的实现. Promise比传统的解决方案(回调函数和事件)更合理和 ...

  8. webpack2进阶之多文件,DLL,以及webpack-merge

    本需要对webpack已有一定的了解,如果你没接触过webpack或者刚刚接触webpack,可以考虑先看一下我的这篇教程. 入门教程 1.打包多文件 之前,当需要打包多个而文件时,我是这么写的: m ...

  9. 这家IT教育公司太拼了:毕业生找不到工作就全额退学费!

    乐橙谷为了让更多的学生有工作,有高薪工作,已经决定尝试一种更刺激的游戏规则:完成课时的学员如果毕业找不到工作,公司将全额退还学费.这家公司秉承着自己的使命:以尊重的文化,敬畏的心态去努力帮助每个学生实 ...

  10. 使用jsonp来实现跨域请求

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...