一、註解開發bean作用範圍與生命週期管理
前面使用註解已經完成了bean的管理,接下來將通過配置實現的內容都換成對應的註解實現,包含兩部分內容:bean作用範圍
和bean生命週期
。
首先準備環境:
-
建立一個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中新增兩個方法,init
和destroy
,方法名可以任意
@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 |
---|---|
型別 | 方法註解 |
位置 | 方法上 |
作用 | 設定該方法為銷燬方法 |
屬性 | 無 |