Spring框架系列(二)之Bean的註解管理

孔乙己學習成長錄發表於2018-02-27

微信公眾號:compassblog

歡迎關注、轉發,互相學習,共同進步!

有任何問題,請後臺留言聯絡!

1、Spring中的兩種容器

在系列(一)中我們已經知道,Spring 是管理物件的容器,其中有2種基本的容器,一種是 ApplicationContext,另一種是 BeanFactory (這種在開發中已經不再使用)。兩種容器的區別如下:

  • ApplicationContext:這種容器在啟動載入 applicationContext.xml 配置檔案時就會建立

  • BeanFactory:這種容器在 getBean 的時候才會建立生成類的例項

2、Spring中Bean 的註解管理方式例項

(1)、新建專案,引入相關 jar 包,如下圖所示:

Spring框架系列(二)之Bean的註解管理

(2)、在 src 下新建配置檔案,開啟使用註解代理配置,程式碼如下:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">

<!-- 指定掃描com.spring.bean報下的所有類中的註解.
     掃描包時,會掃描指定包下的所有子包
 -->
<context:component-scan base-package="com.spring.bean"></context:component-scan>
</beans>
複製程式碼

(3)、將物件註冊到容器,並通過註解給屬性注入值,程式碼如下:

Student.java

package com.spring.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Component("stu")
    @Service("stu") // service層
    @Controller("stu") // web層
    @Repository("stu")// dao層
public class Student {
    //基本屬性
    private String name;

    @Value("22")
    private int age;

    @Autowired  //自動裝配,如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件
    private Book book;

    //setter和getter方法
    public String getName() {
        return name;
    }

    @Value("孔乙己")
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Book getBook() {
        return book;
    }
    public void setBook(Book book) {
        this.book = book;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", book=" + book.toString()
                + "]";
    }

}
複製程式碼

Book.java

package com.spring.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("book")
public class Book {
    //基本屬性
    @Value("Java開發")
    private String name;

    @Value("68")
    private double price;

    //setter和getter方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [name=" + name + ", price=" + price + "]";
    }

}
複製程式碼

(4)、書寫測試類,程式碼如下:

TestDemo.java

package com.spring.test;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.bean.Student;

public class TestDemo {
    @Test
    public void fun1(){

        //1 建立容器物件
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 向容器獲取stu物件
        Student stu1 = (Student) ac.getBean("stu");

        //3 列印stu物件
        System.out.println(stu1.toString());

    }

}
複製程式碼

(5)、使用 JUnit4 進行測試,結果如下圖所示:

Spring框架系列(二)之Bean的註解管理

Spring框架系列(二)之Bean的註解管理

3、Spring 中 Bean 管理的常用註解

(1)、 @Component 元件:作用在類上

Spring中提供 @Component 的三個衍生註解,功能目前是一致的,這三個註解是為了讓標註類本身的用途更加清晰。

  • @Controller : web 層

  • @Service : service 層

  • @Repository : dao 層

(2)、屬性注入的註解:使用註解注入的方式,可以不用提供 set 方法

  • @Value :用於注入普通型別

  • @Autowired :自動裝配: 預設按型別進行裝配,按名稱注入
    注意:如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件

  • @Qualifier :強制使用名稱注入,告訴spring容器自動裝配哪個名稱的物件

  • @Resource :手動注入,指定注入哪個名稱的物件,相當於 @Autowired 和 @Qualifier 一起使用

(3)、Bean 作用範圍的註解

  • @Scope:
    singleton :單例
    prototype :多例

(4)、Bean 生命週期配置的註解

  • @PostConstruct :相當於 init-method方法

  • @PreDestroy :相當於 destroy-method方法

4、Spring 中 Bean 管理方式的比較


基於XML的配置基於註解的配置
Bean 定義<bean id=" " class=" "/>@Component 或者其衍生類
Bean 名稱通過 id 或 name 制定@Component(" ")
Bean 注入<property> 屬性或者或者 p 名稱空間@Autowired 或者 @Qualifier 或者 @Resource
Bean 作用範圍scope 範圍屬性@Scope
Bean 宣告過程初始化 init-methode 和銷燬 destroy-method初始化 @PostConstruct 和銷燬 @PreDestroy


  • 基於XML的配置:結構清晰,但開發不便

  • 基於註解的配置:屬性注入容易,開發方便


關注微信公眾號compassblog,後臺回覆 “Spring系列二” 獲取本專案原始碼


您可能還喜歡:


本系列後期仍會持續更新,歡迎關注!


如果你認為這篇文章有用,歡迎轉發分享給你的好友!

本號文章可以任意轉載,轉載請註明出處!


掃碼關注微信公眾號,瞭解更多

Spring框架系列(二)之Bean的註解管理


相關文章