Spring定義bean的三種方式和自動注入
阿新 • • 發佈:2019-01-23
前言:隨著一個專案規模的增大,我們不得不引入許多Java bean物件,而這些物件一般來說是在Spring的配置檔案applicationContext.xml中進行配置的,這樣就聲明瞭這是一個由Spring容器管理的bean物件。這種做法必然會導致Spring的配置檔案的可讀性很差。在Spring中,我們有一些小技巧可以避免這種情況。這就是本篇文章所討論的。
1、定義bean的三種途徑:
方法一:基於XML的bean定義(需要提供setter方法)- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <beanid="student"class="test.Student">
- <propertyname="name"value="張三"/>
- <propertyname="teacher"
- </bean>
- <beanid="teacher"class="test.Teacher">
- <propertyname="name"value="李四"/>
- </bean>
- </beans>
- 方法二:基於註解的bean定義(不需要提供setter方法)
- @Component
- publicclass Teacher {
- @Value("李四")
- private String name;
- public String getName() {
- return name;
- }
- }
- @Component("student")
- publicclass Student {
- @Value("張三")
- private String name;
- @Resource
- private Teacher teacher;
- public String getName() {
- return name;
- }
- public Teacher getTeacher() {
- return teacher;
- }
- }
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <!--掃描元件的包目錄-->
- <context:component-scanbase-package="test"/>
- </beans>
- publicclass Main {
- publicstaticvoid main(String args[]){
- FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml的絕對路徑");
- Student student= (Student) context.getBean("student");
- Teacher teacher= (Teacher) context.getBean("teacher");
- System.out.println("學生的姓名:"+student.getName()+"。老師是"+student.getTeacher().getName());
- System.out.println("老師的姓名:"+teacher.getName());
- }
- }
- @Configuration
- publicclass BeansConfiguration {
- @Bean
- public Student student(){
- Student student=new Student();
- student.setName("張三");
- student.setTeacher(teacher());
- return student;
- }
- @Bean
- public Teacher teacher(){
- Teacher teacher=new Teacher();
- teacher.setName("李四");
- return teacher;
- }
- }
- publicclass Main {
- publicstaticvoid main(String args[]){
- AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(BeansConfiguration.class);
- Student student= (Student) context.getBean("student");
- Teacher teacher= (Teacher) context.getBean("teacher");
- System.out.println("學生的姓名:"+student.getName()+"。老師是"+student.getTeacher().getName());
- System.out.println("老師的姓名:"+teacher.getName());
- }
- }
二、Spring的自動注入
- Spring提供了五種自動裝配的型別
- 基於XML的自動裝配
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <beanid="student"class="test.Student"autowire="byName">
- <propertyname="name"value="張三"/>
- </bean>
- <beanid="teacher"class="test.Teacher">
- <propertyname="name"value="李四"/>
- </bean>
- </beans>
- 基於註解的自動裝配
- @Component("teacher")
- publicclass Teacher {
- @Value("李四")
- private String name;
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- }
- @Component("student")
- publicclass Student {
- @Value("張三")
- private String name;
- @Resource
- private Teacher teacher;
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- public Teacher getTeacher() {
- return teacher;
- }
- publicvoid setTeacher(Teacher teacher) {
- this.teacher = teacher;
- }
- }
三、如何進行選擇?
其實說了這麼多,我們應該如何對這些不同方式進行權衡和選擇呢?這個見仁見智,我說說我常用的方式。- 定義bean:一般我使用基於註解的bean定義。這樣可以擺脫使用XML或是Java類對大量bean進行配置的噩夢,讓程式變得簡潔。註解還可以清楚地指明元件所在的層次。但是也有特殊的情況,比如說配置資料來源,也許某個元件並不是你寫的(來自於Spring或是第三方jar包裡面的元件等),你沒有辦法在這些元件裡面加上這些註解使之成為Spring容器管理的bean(別人也不會為你加上這些註解,因為他們不知道你會使用到哪些元件)。這種情況下就得使用XML或是Java類進行配置了,個人比較喜歡XML配置。如下例子:
- <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>
- <propertyname="url"value="jdbc:mysql://localhost:3306/study"/>
- <propertyname="username"value="賬號"/>
- <propertyname="password"value="密碼"/>
- </bean>
- 自動裝配:一般我使用基於註解的自動裝配。同樣也是為了減少XML配置檔案的“篇幅”。
- 通過使用基於註解的bean定義和自動裝配,大大減少了XML配置檔案的長度,增加了程式的可讀性。