使用@Autowired标注来进行porperty与Bean的auto-wiring。

准备

首先要使用@Autowired需要在spring-config.xml 中增加配置,一般有两种方式:

1.在配置文件中增加context命名空间定义,并添加<context:annotation-config /> 标签配置。

完整代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 注意上方定义中的 xmlns:context="http://www.springframework.org/schema/context"
与xsi:schemaLocation中的http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
都需要进行定义,否则下边使用<context:annotation-config />在运行时会抛出
The prefix "context" for element "context:annotation-config" is not bound.异常
-->
<context:annotation-config />
<!-- 其他代码 -->
</beans>

2.直接加入AutowiredAnnotationBeanPostProcessor的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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- 其他代码 -->
</beans>

@Autowired标注的使用方式

@Autowired可以使用在JAVA代码中的三个位置:属性,setter方法和构造方法上方。示例如下:

package autowiring;
import org.springframework.beans.factory.annotation.Autowired;
public class MessageLooper
{
@Autowired
private Message message;
public Message getMessage()
{
return message;
}
@Autowired
public void setMessage(Message message3)
{
System.out.println("setter autowired");
System.out.println(message3.getMessageContent());
this.message = message3;
}
public MessageLooper(){};
@Autowired
public MessageLooper(Message message2)
{
System.out.println("constructor autowired");
System.out.println(message2.getMessageContent());
this.message = message2;
};
public void printMessage()
{
if(message != null)
{
System.out.println("final result");
System.out.println(message.getMessageContent());
}
else
System.out.println("no message");
}
}

在XML配置autowiring时可以定义autowire的方式,byName,byType,constructor,而使用@Autowired,由放置位置不同可以区别具体进行自动绑定的属性或构造方法,但是不管放置在属性,setter方法还是构造方法上仍然需要确定是根据byName还是byType进行绑定。很多资料上说,@Autowired是根据类型绑定的也就是byType。但是根据下边的Demo代码,可以看到实际上,也有byName的匹配方式存在。

代码Demo

spring-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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<bean id="messageLooper" class="autowiring.MessageLooper"  />
<bean id="message" class="autowiring.Message" >
<property name="messageContent" value="How are you ?" />
</bean>
<bean id="message2" class="autowiring.Message"  >
<property name="messageContent" value="How are you ???????" />
</bean>
<bean id="message3" class="autowiring.Message"  >
<property name="messageContent" value="How are you !!!!!!" />
</bean>
</beans>

上边配置文件中配置了三个同类型但是不同id的bean定义。

以下根据bean定义使用@Autowired进行了标注:

package autowiring;
import org.springframework.beans.factory.annotation.Autowired;
public class MessageLooper
{
@Autowired
private Message message;
public Message getMessage()
{
return message;
}
@Autowired
public void setMessage(Message message3)
{
System.out.println("setter autowired");
System.out.println(message3.getMessageContent());
this.message = message3;
}
public MessageLooper(){};
@Autowired
public MessageLooper(Message message2)
{
System.out.println("constructor autowired");
System.out.println(message2.getMessageContent());
this.message = message2;
};
public void printMessage()
{
if(message != null)
{
System.out.println("final result");
System.out.println(message.getMessageContent());
}
else
System.out.println("no message");
}
}

执行main方法:

package autowiring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AutowingMain
{
/**
* @comment [注释说明]
* @author  荣磊, 2012-7-20
*/
public static void main(String[] args)
{
String configString = "autowiring/spring-config.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configString);
MessageLooper messageLooper = context.getBean("messageLooper", MessageLooper.class);
messageLooper.printMessage();
}
}

Message类代码:

package autowiring;
public class Message
{
String messageContent;
public String getMessageContent()
{
return messageContent;
}
public void setMessageContent(String messageContent)
{
this.messageContent = messageContent;
}
}

运行结果:

通过运行结果可以看到,当有多个类型可以匹配时,Spring使用了byName的方式进行了匹配,而且匹配的顺序是constructor,field,setter。

而当有多个类型可以匹配,却没有通过byName方式可以匹配成功的话,会抛出有多于一个的相同类型的bean可以匹配的异常。

Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)相关推荐

  1. Spring学习笔记(一):bean对象的配置Ioc

    文章目录 把对象创建交给spring管理 一.创建bean的三种方式 二.bean对象的作用范围 三.bean对象的生命周期 spring中的依赖注入 一.构造函数注入(除非必须,一般不用) 二.se ...

  2. Spring学习笔记:2(IOC装配Bean之xml方式)

    xml配置方式装配Bean 本文借鉴于:https://www.cnblogs.com/qdhxhz/p/6511887.html Spring框架Bean实例化的方式提供了三种方式实例化Bean 构 ...

  3. Spring学习笔记之AOP配置篇(一) 注解配置

    目录 1. 创建并声明一个切面 2. 使用切面的通知 3. 定义切面的优先级 4. 使用切入点表达式 1. 创建并声明一个切面 首先,创建一个类,添加@Component注解使其添加到IoC容器 然后 ...

  4. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  5. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  6. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  7. spring学习笔记01-BeanFactory和ApplicationContext的区别

    spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别           BeanFa ...

  8. Spring学习笔记:配置单数据源

    Spring学习笔记:配置单数据源 一.Spring Boot默认数据源类型 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfig ...

  9. Spring 学习笔记----->AOP

    Spring 学习笔记----->AOP 代理模式 为什么学代理模式? 因为这就是Spring Aop的底层 代理模式的分类: 静态代理 动态代理 静态代理 生活用的例子: 房东 public ...

最新文章

  1. java 集合存储空字符窜_java中字符串对象和集合的判空
  2. SQL 语句转换格式函数Cast、Convert
  3. 死磕Java并发:J.U.C之阻塞队列:ArrayBlockingQueue
  4. Zookeeper分布式一致性原理(二):一致性协议
  5. 【TypeScript】使用 const 关键字声明只读变量
  6. 局部特征(4)——SIFT和SURF的比较
  7. SSM框架整合(一)
  8. Python-数据结构-哈希表
  9. java,js获取数组最大/小值
  10. android jersey 上传图片,图片上传--Jersey实现RESTful接口
  11. 第二篇:ssh.invoke_shell() 切换root出现的新问题
  12. 【转载】C#, VB.NET如何将Excel转换为PDF
  13. 开发小技巧: 如何在jQuery中禁用或者启用滚动事件.scroll
  14. qt信号发送间隔短而槽耗时多_Qt 信号和槽机制详解
  15. 7.STC15W408AS单片机串口通信
  16. 【游戏开发创新】自学Blender建模,自制孔明灯,在Unity中点亮整个星空,愿新年,胜旧年(Unity | 建模 | 粒子系统 | 预设)
  17. 第一部分——交错(拉丝)(Interlace)的产生
  18. 《自然语言处理入门》何晗阅读笔记—第1章:自然语言处理基础概念
  19. 走进小作坊(十三)----并购之战
  20. 用C语言编写程序,任意输入一个字符串,将其中的字符按从小到大的顺序重排

热门文章

  1. Goroutine 并发调度模型深度解析之手撸一个高性能 goroutine 池
  2. vs2015编写基本C
  3. 【论文翻译】GoogleNet网络论文中英对照翻译--(Going deeper with convolutions)
  4. 全志v3s学习笔记(8)——TF卡分区及烧录
  5. 教你写一个ftp协议(文件传输协议)
  6. 【深入kotlin】 - 方法引用和属性引用
  7. Linux环境下Nginx部署静态资源文件。
  8. Hugo 博客搭建教程
  9. 复杂网络链路预测的研究现状及展望(2010)
  10. 北京地铁21号线_北京迎来地铁大动脉,设有21站,全为地下线,沿线市民幸运了...