上一回说到IoC的基于xml配置方法的注入,现在来聊一下基于注解的注入。。
也是用上一回那两个类:Student School。
使用注解会显得比配置简单好多,仅仅需要几个注解就搞定了,比如下面的:
School
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool") //表示当前类被spring所管理
public class School {
@Value("001")
private String sid;//学校编号
@Value("蓝鸟")
private String sname;//学校校名
public School(){
}
//带参的构造方法,将两个属性作为参数传进来
public School(String sid, String sname) {
this.sid = sid;
this.sname = sname;
}
public void setSid(String sid) {
this.sid = sid;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSid() {
return sid;
}
public String getSname() {
return sname;
}
@Override
public String toString() {
return "School [sid=" + sid + ", sname=" + sname + "]";
}
}
Student
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("myStudent") //表示当前类被spring所管理
public class Student {
@Value("小花")
private String name;// 学生姓名
@Autowired //byName方式自动注入
private School school;//学生所读学校
public Student(){
}
//带参的构造方法
public Student(String name, School school) {
super();
this.name = name;
this.school = school;
}
public void setName(String name) {
this.name = name;
}
public void setSchool(School school) {
this.school = school;
}
public String getName() {
return name;
}
public School getSchool() {
return school;
}
@Override
public String toString() {
return "Student [name=" + name + ", school=" + school + "]";
}
}
可见,使用注解只需要先在类的上面给个 @Component 注解 这样就等于跟spring说:“嘿!大哥,我这个需要你管理哦~” 然后在属性上面也给了 @Value 注解,并给出要注入的即可。。
当然,只在类上操作还不行,还需要在配置文件中给出配置,毕竟容器都是读配置文件的,这个配置也超级简单,只需要一个叫 组件扫描器的东西就可以了,不过这个扫描器是context标签的,所以要在配置文件中引入context约束。
配置如下所示:
<context:component-scan base-package="com.czp.ioc_di" />
是的,这样就可以了,其中 base-package 给出包路劲就行了,这个组件扫描器就会扫描给出的包中的bean。
需要注意的是,如果域属性要用byType方式的自动注入,要这样配置
@Autowired
@Qualifier("mySchool")//byType自动注入
private School school;//学生所读学校
就是说不能缺少前面那个 @Autowired 注解,可以这样理解:这个注解只是声明了自动注入,而且默认是byName方式,如果想要用byType就要再配置一个注解。