Spring自动装配----注解装配----Spring自带的@Autowired注解
父类
package cn.ychx;
public interface Person {
public void sayHello();
}
学生子类package cn.ychx;
public class Student implements Person {
@Override
public void sayHello() {
System.out.println("Hello! My name is Tom, I'm a Student.");
}
}教师子类package cn.ychx;
public class Teacher implements Person {
@Override
public void sayHello() {
System.out.println("Hello! My name is Alice, I'm a Teacher.");
}
}
表演类
package cn.ychx;
public interface Performer {
public void perform();
}
玩游戏package cn.ychx;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class PlayGame implements Performer {
@Autowired(required=false)
@Qualifier("student")
private Person person;
@Override
public void perform() {
if (person == null) {
System.out.println("Person is not exist.");
return;
}
person.sayHello();
}
}配置文件
执行package cn.ychx; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private static ApplicationContext ctx; public static void main(String[] args) { ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Performer performer = (Performer) ctx.getBean("playGame"); if (performer != null) { performer.perform(); } else { System.out.println("Object is null."); } } }
执行结果Hello! My name is Tom, I'm a Student.
通过修改@Qualifier("teacher")可以得到结果
Hello! My name is Alice, I'm a Teacher.
示例使用的是Spring自带的@Autowired注解,实现将Person的实现类(student或者teacher)注入PlayGame类的person属性中。
1.启用Spring注解支持
<context:annotation-config/>
2.@Autowired(required=false)注解
可以标注在属性,set方法,构造器上,使用byType寻找上下文的bean。可以看到示例中标注在属性上面,这时可以省略set方法,不受private的影响。
required=false说明Bean的注入不是必须的,也就是说可以删除配置文件中的student和teacher的Bean,这时PlayGame中的person属性为null
4.@Qualifier("student")注解
用来明确指定要使用的bean(双引号中的)是谁,为什么使用这个注解,因为可以满足PlayGame中的person属性的Bean不是唯一的,有两个分别是student和teacher,
这时Sping不知道该使用那个去注入,就会抛出异常。当使用@Qualifier("student")注解,就可以明确的告诉Spring在有多个Bean满足条件是用哪个。
5.缺点是会引入对Spring的特定依赖