[Spring Framework]注解开发②(注解配置scope、生命周期钩子)
2023-09-27 14:26:45 时间
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);
}
}
结果:
然后我们将它变为非单例模式:
@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 |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为销毁方法 |
属性 | 无 |
相关文章
- 实现SpringBoot项目的多数据源配置的两种方式(dynamic-datasource-spring-boot-starter和自定义注解的方式)
- spring-framework源码第1弹------源码运行环境的构建
- Spring-事物-不依赖应用服务器的开源JTA事物实现
- Spring Boot使用Druid连接池基本配置
- Spring MVC表单提交中文数据出现乱码
- Spring Boot 排除自动配置的 4 种方法,关键时刻很有用!
- Spring Cloud Eureka 你还在让它裸奔吗??
- 什么是Spring Boot?
- spring+myBatis 配置多数据源,切换数据源
- 【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)
- 转:Spring mvc中@RequestMapping 6个基本用法小结
- jdk1.6环境下struts2改spring boot方案
- 记一次 Spring 事务配置踩坑记
- Spring Boot中的缓存支持(一)注解配置与EhCache使用
- Spring学习4-面向切面(AOP)之schema配置方式
- Spring入门程序_01【applicationContext.xml配置文件的编写 <bean id=“ “ class=“ “> ClassPathXmlApplicationContext】
- Spring练习,定义三个模块,使用<import>标签完成分模块配置开发,模拟实现学生借书和还书的过程,将结束输出到控制台。
- 深入理解 Spring Cloud Gateway 的原理
- 使用Spring Session做分布式会话管理
- quartz + spring 配置示例
- Spring常用配置
- 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)
- Spring Boot配置支持跨域访问
- spring cloud feign的各种配置的使用