前面使用註解已經完成了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)先執行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類,列印結果:
名稱 | @Scope |
---|---|
型別 | 類註解 |
位置 | 類定義上方 |
作用 | 設定該類建立物件的作用範圍 可用於設定建立出的bean是否為單例物件 |
屬性 | value(預設):定義bean作用範圍, 預設值singleton(單例),可選值prototype(非單例) |
(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包被移除了,這兩個註解剛好就在這個包中。
名稱 | @PostConstruct |
---|---|
型別 | 方法註解 |
位置 | 方法上 |
作用 | 設定該方法為初始化方法 |
屬性 | 無 |
名稱 | @PreDestroy |
---|---|
型別 | 方法註解 |
位置 | 方法上 |
作用 | 設定該方法為銷燬方法 |
屬性 | 無 |
本文來自部落格園,作者:|舊市拾荒|,轉載請註明原文連結:https://www.cnblogs.com/xiaoyh/p/16324427.html