使用
@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; } }
繼續查看結果