@Autowiread默认使用的是byType自动注入
package com.chentianyu.ba02;public class School {private String name;private String address;}
package com.chentianyu.ba02;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class Student {private String name;private Integer age;/*** 引用类型* @Autowired: spring框架提供的注解,实现引用类型的赋值* spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType** @Autowired: 默认使用的是byType自动注入。** 位置: 1.属性定义的上面,无需set方法,推荐使用* 2.set方法的上面*/@Autowiredprivate School school;}
如果是byType类型(按类型)注入,那school同源;在spring容器中找一个与School同源的对象;但是我们在ba02包下没有School这个类型的对象?
没有。在配置文件中没有声明对象,School也没有用注解声明
那可以用注解去声明
package com.chentianyu.ba02;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class School {@Value("杭州职业技术学院")private String name;@Value("杭州下沙")private String address;@Overridepublic String toString() {return "School{" +"name='" + name + '\'' +", address='" + address + '\'' +'}';}}
package com.chentianyu.ba02;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class Student {private String name;private Integer age;/*** 引用类型* @Autowired: spring框架提供的注解,实现引用类型的赋值* spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType** @Autowired: 默认使用的是byType自动注入。** 位置: 1.属性定义的上面,无需set方法,推荐使用* 2.set方法的上面*/@Autowiredprivate 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", school=" + school +'}';}}
@Testpublic void test02(){String config = "applicationContext.xml";ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);com.chentianyu.ba02.Student student = (com.chentianyu.ba02.Student) applicationContext.getBean("student");System.out.println(student);}
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}
不报错,但是是没有值的执行结果
