0
点赞
收藏
分享

微信扫一扫

[Spring Framework]注解开发②(注解配置scope、生命周期钩子)


文章目录

  • ​​bean管理​​
  • ​​bean的作用范围​​
  • ​​bean的生命周期​​
  • ​​总结​​

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

类型

类注解

位置

类定义上方

作用

设置该类创建对象的作用范围

可用于设置创建出的bean是否为单例对象

属性

value(默认):定义bean作用范围,

默认值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);
}
}

结果:

[Spring Framework]注解开发②(注解配置scope、生命周期钩子)_java


然后我们将它变为非单例模式:

@Component("bookDao")
@Scope("prototype")
public class BookDaoImpl3 implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}

再运行结果,结果为:

[Spring Framework]注解开发②(注解配置scope、生命周期钩子)_生命周期_02

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();
}
}

结果:

[Spring Framework]注解开发②(注解配置scope、生命周期钩子)_生命周期_03

注意:@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

类型

方法注解

位置

方法上

作用

设置该方法为销毁方法

属性


[Spring Framework]注解开发②(注解配置scope、生命周期钩子)_spring_04


举报

相关推荐

0 条评论