@Autowiread默认使用的是byType自动注入

  1. package com.chentianyu.ba02;
  2. public class School {
  3. private String name;
  4. private String address;
  5. }
  1. package com.chentianyu.ba02;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class Student {
  6. private String name;
  7. private Integer age;
  8. /**
  9. * 引用类型
  10. * @Autowired: spring框架提供的注解,实现引用类型的赋值
  11. * spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType
  12. *
  13. * @Autowired: 默认使用的是byType自动注入。
  14. *
  15. * 位置: 1.属性定义的上面,无需set方法,推荐使用
  16. * 2.set方法的上面
  17. */
  18. @Autowired
  19. private School school;
  20. }

如果是byType类型(按类型)注入,那school同源;在spring容器中找一个与School同源的对象;但是我们在ba02包下没有School这个类型的对象?

没有。在配置文件中没有声明对象,School也没有用注解声明

那可以用注解去声明

  1. package com.chentianyu.ba02;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class School {
  6. @Value("杭州职业技术学院")
  7. private String name;
  8. @Value("杭州下沙")
  9. private String address;
  10. @Override
  11. public String toString() {
  12. return "School{" +
  13. "name='" + name + '\'' +
  14. ", address='" + address + '\'' +
  15. '}';
  16. }
  17. }
  1. package com.chentianyu.ba02;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class Student {
  6. private String name;
  7. private Integer age;
  8. /**
  9. * 引用类型
  10. * @Autowired: spring框架提供的注解,实现引用类型的赋值
  11. * spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType
  12. *
  13. * @Autowired: 默认使用的是byType自动注入。
  14. *
  15. * 位置: 1.属性定义的上面,无需set方法,推荐使用
  16. * 2.set方法的上面
  17. */
  18. @Autowired
  19. private School school;
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public Integer getAge() {
  27. return age;
  28. }
  29. public void setAge(Integer age) {
  30. this.age = age;
  31. }
  32. @Override
  33. public String toString() {
  34. return "Student{" +
  35. "name='" + name + '\'' +
  36. ", age=" + age +
  37. ", school=" + school +
  38. '}';
  39. }
  40. }
  1. @Test
  2. public void test02(){
  3. String config = "applicationContext.xml";
  4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);
  5. com.chentianyu.ba02.Student student = (com.chentianyu.ba02.Student) applicationContext.getBean("student");
  6. System.out.println(student);
  7. }
  1. Student{name='null', age=null, school=School{name='杭州职业技术学院', address='杭州下沙'}}

@Autowired使的byName

package com.chentianyu.ba02;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Student {
    private String name;
    private Integer age;

    /**
     * 引用类型
     * @Autowired: spring框架提供的注解,实现引用类型的赋值
     * spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType
     *
     * @Autowired: 默认使用的是byType自动注入。
     *
     * 位置: 1.属性定义的上面,无需set方法,推荐使用
     *      2.set方法的上面
     *      
     * 如果要使用byName方式,需要做的是:
     *  1.在属性的上面加入@Autowired
     *  2.在属性的上面加入@Qualifier(value = "bean的id"): 表示使用指定的bean完成赋值
     */
    @Autowired
    @Qualifier(value = "school")
    private School school;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

引用类型Autowired的required属性

如果说我们前面的

@Autowired
@Qualifier(value = "school")

写成

@Autowired
@Qualifier(value = "school-1")

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'student': Unsatisfied dependency expressed through field 'school'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.chentianyu.ba02.School' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)

属性: required,是一个boolean类型的,默认为true

  • required=true: 表示引用类型赋值失败,程序报错,并终止执行。
  • required=false: 引用数据类型如果赋值失败,程序正常执行,引用类型就是一个null
@Autowired(required = false)
@Qualifier(value = "school-1")
private School school;
Student{name='null', age=null, school=null}

不报错,但是是没有值的执行结果