@[TOC]
bean管理
首先我们描述一下项目背景:
有一个配置类,用来扫描对应impl包中的注解:
@Configuration
@ComponentScan("impl")
public class SpringConfig {
}
有一个实现类BookDaoImpl3(在impl包中):
@Component("bookDao")
public class BookDaoImpl3 implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
接下来我们就说说如何用注解实现:
- bean的生命周期管理
- scope作用范围的管理
bean的作用范围
@Scope
名称 | @Scope |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 设置该类创建对象的作用范围<br/>可用于设置创建出的bean是否为单例对象 |
属性 | value(默认):定义bean作用范围,<br/>==默认值singleton(单例),可选值prototype(非单例)== |
我们可以运行一个demo来试验一下:
public class App7 {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao1 = ctx.getBean("bookDao", BookDao.class);
BookDao bookDao2 = ctx.getBean("bookDao", BookDao.class);
System.out.println(bookDao1);
System.out.println(bookDao2);
}
}
结果:
然后我们将它变为非单例模式:
@Component("bookDao")
@Scope("prototype")
public class BookDaoImpl3 implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
再运行结果,结果为:
bean的生命周期
(1)在BookDaoImpl中添加两个方法,init
和destroy
,方法名可以任意
@Component("bookDao")
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
注解即可。
@Component("bookDao")
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的类
注意:
==非单例模式是不能运行destroy方法的!==
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao1 = ctx.getBean("bookDao", BookDao.class);
BookDao bookDao2 = ctx.getBean("bookDao", BookDao.class);
System.out.println(bookDao1);
System.out.println(bookDao2);
ctx.close();
}
}
结果:
==注意:@PostConstruct和@PreDestroy注解如果找不到,需要导入下面的jar包==
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
找不到的原因是,从JDK9以后jdk中的javax.annotation包被移除了,这两个注解刚好就在这个包中。
总结
@PostConstruct
名称 | @PostConstruct |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为初始化方法 |
属性 | 无 |
@PreDestroy
名称 | @PreDestroy |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为销毁方法 |
属性 | 无 |