学习笔记:Spring中default-autowire与autowire区别
2016-05-26 17:16
429 查看
default-autowire与autowire主要用于Spring的IOC的注解注入,明白两者的区别和用法将使你的开发事半功倍。
Spring 提供了Resource、Autowired这两个注解用于注入,另外在xml配置文件中,beans标签下有一个参数default-autowire用来设置默认的注入类型。
在beans标签设置default-autowire=”byName”后,在spring容器实例化bean(包含xml配置bean和注解方式bean)时,该bean内部的字段会自动根据byName装载spring容器里的bean。如下:
Spring配置文件中
Student类
此时spring容器启动加载bean时候由于在beans标签设置default-autowire=”byName”,那么在加载Student的Bean时候,会把字符串”Tom”注入到Student类的stu_name字段,而由于配置了自动注入所有在注入teacher字段时候,会扫描容器里id为teacher的Bean注入到该字段中,而不用再在id为student的Bean配置了。
(1)XML中配置Bean的参数
Autowire配置的可选值依然如上述表格中的说明,XML配置文件如下:
同样,spring容器启动加载bean时候,在加载到Student的Bean时候,会把字符串”Tom”注入到Student类的stu_name字段,而同时由于对这个类配置了autowire=”byName”参数,所以会扫描spring容器中id为teacher的Bean然后注入到该类的teacher字段中。
(2)@Autowired注解注入
@Autowired往往用在类中注解注入,在配置xml需要配置才能使用@Autowired标识
在类中使用@Autowired标识注入字段
Spring 提供了Resource、Autowired这两个注解用于注入,另外在xml配置文件中,beans标签下有一个参数default-autowire用来设置默认的注入类型。
default-autowire和autowire的可选值
可选值 | 功能说明 |
---|---|
no | 默认不使用autowiring。 必须显示的使用”“标签明确地指定bean。 |
byName | 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。 |
byType | 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 dependency-check=”objects”让Spring抛出异常。 |
constructor | 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
autodetect | 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |
beans标签设置default-autowire参数
在spring的配置文件中可以参照如下设置default-autowire参数<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.xsd" default-autowire="byName">
在beans标签设置default-autowire=”byName”后,在spring容器实例化bean(包含xml配置bean和注解方式bean)时,该bean内部的字段会自动根据byName装载spring容器里的bean。如下:
Spring配置文件中
<bean id="teacher" class="com.haiwi.spring.Teacher"></bean> <bean id="student" class="com.haiwi.spring.Student"> <property name="stu_name" value="Tom" /> </bean>
Student类
public class Teacher { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Student { private Teacher teacher; private String stu_name; public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public String getStu_name() { return stu_name; } public void setStu_name(String stu_name) { this.stu_name = stu_name; } }
此时spring容器启动加载bean时候由于在beans标签设置default-autowire=”byName”,那么在加载Student的Bean时候,会把字符串”Tom”注入到Student类的stu_name字段,而由于配置了自动注入所有在注入teacher字段时候,会扫描容器里id为teacher的Bean注入到该字段中,而不用再在id为student的Bean配置了。
autowire参数的用法
autowire可用在两次:XML中配置Bean的参数和@Autowired注解注入。两者都是把对应的类实现自动注入。(1)XML中配置Bean的参数
Autowire配置的可选值依然如上述表格中的说明,XML配置文件如下:
<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.xsd"> <bean id="teacher" class="com.haiwi.spring.Teacher"></bean> <bean id="student" class="com.haiwi.spring.Student" autowire="byName"> <property name="stu_name" value="Tom" /> </bean> ….. </beans>
同样,spring容器启动加载bean时候,在加载到Student的Bean时候,会把字符串”Tom”注入到Student类的stu_name字段,而同时由于对这个类配置了autowire=”byName”参数,所以会扫描spring容器中id为teacher的Bean然后注入到该类的teacher字段中。
(2)@Autowired注解注入
@Autowired往往用在类中注解注入,在配置xml需要配置才能使用@Autowired标识
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema 4000 /beans http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-beans.xsd"> <context:annotation-config /> <bean id="teacher" class="com.haiwi.spring.Teacher"></bean> <bean id="student" class="com.haiwi.spring.Student" autowire="byName"> <property name="stu_name" value="Tom" /> </bean> ….. </beans>
在类中使用@Autowired标识注入字段
@Autowired @Qualifier("teacher") private Teacher teacher; public void setTeacher(Teacher teacher) { this.teacher = teacher; }
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- springmvc 发送ajax出现中文乱码的解决方法汇总
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 浅析Java中的set集合类型及其接口的用法