[Spring Framework]注解开发②(注解配置scope、生命周期钩子)
【摘要】
文章目录
bean管理bean的作用范围bean的生命周期
总结
bean管理
首先我们描述一下项目背景:
有一个配置类,用来扫描对应impl包中的注解:
@Configurati...
bean管理
首先我们描述一下项目背景:
有一个配置类,用来扫描对应impl包中的注解:
@Configuration
@ComponentScan("impl")
public class SpringConfig {
}
- 1
- 2
- 3
- 4
- 5
有一个实现类BookDaoImpl3(在impl包中):
@Component("bookDao")
public class BookDaoImpl3 implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
接下来我们就说说如何用注解实现:
- 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结果:
然后我们将它变为非单例模式:
@Component("bookDao")
@Scope("prototype")
public class BookDaoImpl3 implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
再运行结果,结果为:
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 ...");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
(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 ...");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结果:
注意:@PostConstruct和@PreDestroy注解如果找不到,需要导入下面的jar包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
找不到的原因是,从JDK9以后jdk中的javax.annotation包被移除了,这两个注解刚好就在这个包中。
总结
@PostConstruct
名称 | @PostConstruct |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为初始化方法 |
属性 | 无 |
@PreDestroy
名称 | @PreDestroy |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为销毁方法 |
属性 | 无 |
文章来源: blog.csdn.net,作者:十八岁讨厌编程,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/zyb18507175502/article/details/125782457
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)