SpringBoot中@Configuration和@Component注解的區別(23)


使用

@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;
    }
}

繼續查看結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM