1. 程式人生 > >Spring裝配Bean(基於Java程式碼裝配)

Spring裝配Bean(基於Java程式碼裝配)

                                             通過Java配置裝配Bean

在很多的情況下,Spring基於組建掃描和自動裝配是最佳方式。但是有時候,我們必須使用顯示的裝配。例如,我們使用一個第三方庫,我們不可能為庫中的類添加註釋。接下來我依然用學生讀書的例子來進行演示。

通過Java配置裝配Bean,就是將配置資訊寫在一個Java類中,我們在這裡寫一個配置類。

@Configuration
public class JavaConfig {
}

從上面可以看到,這個類的上面使用@Configuration註釋,這個註釋表明了這個Java類是一個Spring配置類。接下來讓我們看一下怎麼在這裡宣告一個Bean。

@Configuration
public class JavaConfig {

    @Bean
    public Book mathBook(){
        return new MathBook();
    }

}

從上面可以看出我們寫了一個可以返回相應物件的方法,並在方法體上面寫上了@Bean註釋,這表明他是一個Bean,當Spring容器要生成Bean的時候,便會呼叫這個方法,的到相應的實體類。這裡生成的Bean的ID就是方法名mathBook。我們也可以為它另起一個名字。我們可以使用@Bean註釋的name屬性做到。

@Configuration
public class JavaConfig {

    @Bean( name= "newName")
    public Book mathBook(){
        return new MathBook();
    }

}

接來下讓我們看看怎麼利用Java配置實現注入。注入主要有構造器注入和setter方法注入。我們先來看構造器注入的實現。有以下的學生類。

public class Student implements People {

    private Book book;

    public Student(Book book) {
        this.book = book;
    }

    @Override
    public void seeBook() {
        book.say();
    }
}

我們可以看到,Student類中的book屬性是通過構造方法注入的,我們有兩種寫法。其一如下:

@Configuration
public class JavaConfig {

    @Bean
    public Book mathBook(){
        return new MathBook();
    }

    @Bean
    public People student(Book book){
        Student student=new Student(book);
        return student;
    }
}

或者這樣寫

@Configuration
public class JavaConfig {

    @Bean
    public Book mathBook(){
        return new MathBook();
    }

    @Bean
    public People student(){
        Student student=new Student(mathBook());
        return student;
    }
}

第一種寫法,當Spring容器要生成student的Bean的時候,會將上面生成的mathBook例項傳進去,達到最終的效果。第二種寫法,我們在直接使用mathBook()方法,但其實這種寫法得到的例項還是上面的Bean,Spring並沒有生成一個新的Bean,這是因為Spring攔截了對mathBook()方法的呼叫,然後直接傳入了前面生成的Bean。預設情況下,Spring中的Bean都是單例的。

接下來讓我們看一下怎麼利用settter方法進行注入,其實大家看到這裡也能夠猜到應該怎麼寫,接下來我為大家演示。首先在Student類中寫寫一個關於屬性的setter方法。

public class Student implements People {

    private Book book;

    public void setBook(Book book) {
        this.book = book;
    }

    @Override
    public void seeBook() {
        book.say();
    }
}

然後在Java配置類中這樣寫。

@Configuration
public class JavaConfig {

    @Bean
    public Book mathBook(){
        return new MathBook();
    }

    @Bean
    public People student(Book book){
        Student student=new Student();
        student.setBook(book);
        return student;
    }
}

是不是和你想的一樣?和我們平時使用Java的習慣一樣。

接下來,讓我們看下怎麼進行驗證,在上一個用XML配置的部落格中,我們利用的是junit框架進行驗證,在這裡,我們用一個比較簡單的方法。就是利用Sprng中的AnnotationConfigApplicationContext類,它是Spring的一種應用上下文,利用它,我們可以獲取Spring容器中的Bean,具體用法如下:

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
        context.register(JavaConfig.class);
        context.refresh();

        MathBook mathBook=(MathBook) context.getBean("mathBook");
        Student student=(Student) context.getBean("student");

        mathBook.say();
        student.seeBook();

        context.close();
    }
}

我們先得到它的物件,然後用他的register方法指定Java配置類,然後呼叫它的refresh()方法。最後用它的getBean方法得到相應的Bean,傳入的引數是Bean的ID。最後的執行結果如下。