Java開發學習(十一)----基於註解開發bean作用範圍與生命週期管理

2022-07-13 06:01:23

一、註解開發bean作用範圍與生命週期管理

前面使用註解已經完成了bean的管理,接下來將通過設定實現的內容都換成對應的註解實現,包含兩部分內容:bean作用範圍bean生命週期

1.1 環境準備

首先準備環境:

  • 建立一個Maven專案

  • pom.xml新增Spring的依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
    </dependencies>
  • 新增一個設定類SpringConfig

    @Configuration
    @ComponentScan("com.itheima")
    public class SpringConfig {
    }
  • 新增BookDao、BookDaoImpl類

    public interface BookDao {
        public void save();
    }
    @Repository
    public class BookDaoImpl implements BookDao {
        public void save() {
            System.out.println("book dao save ..." );
        }
    }
  • 建立執行類App

    public class App {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
            BookDao bookDao1 = ctx.getBean(BookDao.class);
            BookDao bookDao2 = ctx.getBean(BookDao.class);
            System.out.println(bookDao1);
            System.out.println(bookDao2);
        }
    }

最終建立好的專案結構如下:

1.2 Bean的作用範圍

(1)先執行App類,在控制檯列印兩個一摸一樣的地址,說明預設情況下bean是單例

(2)要想將BookDaoImpl變成非單例,只需要在其類上新增@scope註解

@Repository
//@Scope設定bean的作用範圍
@Scope("prototype")
public class BookDaoImpl implements BookDao {
​
    public void save() {
        System.out.println("book dao save ...");
    }
}

再次執行App類,列印結果:

知識點1:@Scope
名稱 @Scope
型別 類註解
位置 類定義上方
作用 設定該類建立物件的作用範圍 可用於設定建立出的bean是否為單例物件
屬性 value(預設):定義bean作用範圍, 預設值singleton(單例),可選值prototype(非單例)

1.3 Bean的生命週期

(1)在BookDaoImpl中新增兩個方法,initdestroy,方法名可以任意

@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    public void init() {
        System.out.println("init ...");
    }
    public void destroy() {
        System.out.println("destroy ...");
    }
}
​

(2)如何對方法進行標識,哪個是初始化方法,哪個是銷燬方法?

只需要在對應的方法上新增@PostConstruct@PreDestroy註解即可。

@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    @PostConstruct //在構造方法之後執行,替換 init-method
    public void init() {
        System.out.println("init ...");
    }
    @PreDestroy //在銷燬方法之前執行,替換 destroy-method
    public void destroy() {
        System.out.println("destroy ...");
    }
}
​

(3)要想看到兩個方法執行,需要注意的是destroy只有在容器關閉的時候,才會執行,所以需要修改App的類

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao1 = ctx.getBean(BookDao.class);
        BookDao bookDao2 = ctx.getBean(BookDao.class);
        System.out.println(bookDao1);
        System.out.println(bookDao2);
        ctx.close(); //關閉容器
    }
}

(4)執行App,類檢視列印結果,證明init和destroy方法都被執行了。

注意:@PostConstruct和@PreDestroy註解如果找不到,需要匯入下面的jar包==

<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>

找不到的原因是,從JDK9以後jdk中的javax.annotation包被移除了,這兩個註解剛好就在這個包中。

知識點1:@PostConstruct
名稱 @PostConstruct
型別 方法註解
位置 方法上
作用 設定該方法為初始化方法
屬性
知識點2:@PreDestroy
名稱 @PreDestroy
型別 方法註解
位置 方法上
作用 設定該方法為銷燬方法
屬性

1.4 總結