使用
@Configuration和@Component都是使用於配置類上以代替XML文件中<beans>標簽;
@Configuration是@Component的擴展,同樣類似的擴展還有@Repository、@Service、@Controller、@RestController等等,而后面四個都是用於傳統三層架構中使用的注解;
在被@Configuration注解的類中所有帶有@Bean注解的方法都會被CGLib動態代理,而后每次調用這些方法時返回的都是第一次返回的實例;
被@Configuration標記的類不能是final類,不能是本地類、訪問修飾符也不能是private。
測試區別
上面說了被@Configuration注解的類中所有帶有@Bean注解的方法都會被CGLib動態代理並在第一次調用之后的每次調用時從BeanFactory中返回相同的實例,而@Component注解則不會。下面的例子展示了其區別:
編輯配置類
通過兩個實體類測試,School屬性包括(String)addr和(Student)student,Student屬性有(String)name和(String)age:
//選擇配置注解
@Configuration
//@Component
public class TestConfiguration {
//生成shool實例的方法
@Bean
public School school() {
School school = new School();
school.setAddr("");
school.setStudent(student()); //這里調用student()新建一個對象給school
return school;
}
//生成student實例的方法
@Bean
public Student student() {
Student student = new Student();
student.setName("xiaoming");
student.setAge(18);
return student;
}
}
編輯控制層用於測試
分別通過注入方式實例化一個school和一個student對象,再判斷school中的student對象與剛剛注入的student對象是否是一個對象:
@RestController
@RequestMapping("/")
public class TestController {
@Autowired
private School school; //注入school
@Autowired
private Student student; //注入student
@RequestMapping("/test")
public String test() {
if (school.getStudent() == student) { //判斷是否是同一個對象
return "同一個student對象";
} else {
return "不同的student對象";
}
}
}
發送請求查看結果

修改注解為@Component
//選擇配置注解
//@Configuration
@Component
public class TestConfiguration {
//生成shool實例的方法
@Bean
public School school() {
School school = new School();
school.setAddr("");
school.setStudent(student()); //這里調用student()新建一個對象給school
return school;
}
//生成student實例的方法
@Bean
public Student student() {
Student student = new Student();
student.setName("xiaoming");
student.setAge(18);
return student;
}
}
發送請求再次查看結果

修改
如果想在@Component注解的類中實現每次返回相同的實例可通過@Autowired先將student注入到一個對象,之后在給school賦值的時候使用這個student對象:
//選擇配置注解
//@Configuration
@Component
public class TestConfiguration {
@Autowired
private Student stu;
//生成shool實例的方法
@Bean
public School school() {
School school = new School();
school.setAddr("");
school.setStudent(stu); //這里使用注入的stu
return school;
}
//生成student實例的方法
@Bean
public Student student() {
Student student = new Student();
student.setName("xiaoming");
student.setAge(18);
return student;
}
}
繼續查看結果

