<bean>元素的autowire属性负责自动装配<bean>标签定义Javabean的属性。这样做可以省去很多配置Javabean属性的标签代码,使代码整洁、美观。
1.按bean名称装配
<bean>元素的byName属性以属性名区分自动装配。在容器中寻找与JavaBean的属性名相同的JavaBean,并将其自动装配到Javabean中。
【例】按Bean名称自动装配User
创建User类
public class User { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
创建Manger类
public class Manger { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
配置applicationContext.xml
<bean id="user" class="com.shw.User"> <property name="name" > <value>小强</value> </property> <property name="age" > <value>25</value> </property> <property name="sex" > <value>男</value> </property> </bean> <bean autowire="byName" id="manger" class="com.shw.Manger"></bean>
创建测试类
public static void main(String[] args) { //加载applicationContext.xml ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取实例 Manger manger=(Manger) context.getBean("manger"); //调用方法 System.out.println("姓名:"+manger.getUser().getName()); System.out.println("年龄:"+manger.getUser().getAge()); System.out.println("性别:"+manger.getUser().getSex()); }
2.按bean类型装配
spring以bean类型区分自动装配,这次容器匹配的不再是bean名称。容器会自动寻找与JavaBean的属性类型相同的Javabean的定义,并将其注入到需要自动装配的JavaBean中。
【例】按bean类型自动装配User
将Manger类的User对象的属性修改为us
public class Manger { private User us; public User getUser() { return us; } public void setUser(User user) { this.us = user; } }
修改applicationContext.xml
<bean autowire="byType" id="manger" class="com.shw.Manger"></bean>
小结:
- byname的时候,需要保证所有bean的id唯一,并且这个bean需要和注入的属性的set方法的值一致
- bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和注入的属性的类型一致
使用注解实现自动配置:
jdk1.5支持的注解,Spring2.5就支持注解了!
要使用注解须知:
-
导入约束 context约束
-
配置注解的支持:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
@Autowired
直接在属性上用即可!也可以在set方式上使用!
使用Autowired我们可以不用使用Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在且符合名字(ByName)
科普:
@Nullable 字段标记了这个注解,说明这个字段可以为null
public @interface Autowired { boolean required() default true; }
测试代码:
public class People { //如果显式的定义了AutoWired的required属性为false,说明这个对象可以为null,否则不允许为空 @Autowired(required = false) private Cat cat; @Autowired private Dog dog; private String name;
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value = "xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入
@Autowired注解
public class people{ @Autowired private Cat cat; @Autowired @Qualifier(value = "dog") private Dog dog; private String name; }
@Resource注解
public class people{ @Resource(name="cat") private Cat cat; @Resource private Dog dog; }
小结
@Resource和@Autowired的区别:
- 都是用来自动装配的,都可以放在属性字段上
- @Autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
- @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!
- 执行顺序不同:@Autowired通过byType的方式实现 @Resource默认通过byname的方式实现
3.在spring中还有另外3种自动装配方式,通过设置autowire的不同属性值来实现。
(1)no属性
这是autowire采用的默认值,它采用自动装配。
(2)constructor属性
通过构造方法的参数类型自动装配。
(3)autodetect属性
首先会使用constructor方式来自动装配,然后使用byType方式。