Java注解如何实现bean作用范围与生命周期管理?

2026-04-11 07:011阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1051个文字,预计阅读时间需要5分钟。

Java注解如何实现bean作用范围与生命周期管理?

一、说明:开发bean作用范围与生命周期管理,已使用注解完成bean管理。接下来将通过配置实现的内容都转换为相应的注解实现,包含两部分内容:bean作用范围和bean生命周期。

二、内容:

1.bean作用范围:设置bean的作用域,如singleton(单例)或prototype(原型)。

2.bean生命周期:管理bean的创建、使用和销毁过程。

一、注解开发bean作用范围与生命周期管理

前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围bean生命周期

1.1 环境准备

首先准备环境:

  • 创建一个Maven项目

  • pom.xml添加Spring的依赖

    Java注解如何实现bean作用范围与生命周期管理?

    <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.2 Bean的作用范围

(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类,打印结果:

知识点1:@Scope
名称 @Scope 类型 类注解 位置 类定义上方 作用 设置该类创建对象的作用范围 可用于设置创建出的bean是否为单例对象 属性 value(默认):定义bean作用范围, 默认值singleton(单例),可选值prototype(非单例)
1.3 Bean的生命周期

(1)在BookDaoImpl中添加两个方法,initdestroy,方法名可以任意

@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包被移除了,这两个注解刚好就在这个包中。

知识点1:@PostConstruct
名称 @PostConstruct 类型 方法注解 位置 方法上 作用 设置该方法为初始化方法 属性 无
知识点2:@PreDestroy
名称 @PreDestroy 类型 方法注解 位置 方法上 作用 设置该方法为销毁方法 属性 无
1.4 总结

本文共计1051个文字,预计阅读时间需要5分钟。

Java注解如何实现bean作用范围与生命周期管理?

一、说明:开发bean作用范围与生命周期管理,已使用注解完成bean管理。接下来将通过配置实现的内容都转换为相应的注解实现,包含两部分内容:bean作用范围和bean生命周期。

二、内容:

1.bean作用范围:设置bean的作用域,如singleton(单例)或prototype(原型)。

2.bean生命周期:管理bean的创建、使用和销毁过程。

一、注解开发bean作用范围与生命周期管理

前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围bean生命周期

1.1 环境准备

首先准备环境:

  • 创建一个Maven项目

  • pom.xml添加Spring的依赖

    Java注解如何实现bean作用范围与生命周期管理?

    <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.2 Bean的作用范围

(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类,打印结果:

知识点1:@Scope
名称 @Scope 类型 类注解 位置 类定义上方 作用 设置该类创建对象的作用范围 可用于设置创建出的bean是否为单例对象 属性 value(默认):定义bean作用范围, 默认值singleton(单例),可选值prototype(非单例)
1.3 Bean的生命周期

(1)在BookDaoImpl中添加两个方法,initdestroy,方法名可以任意

@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包被移除了,这两个注解刚好就在这个包中。

知识点1:@PostConstruct
名称 @PostConstruct 类型 方法注解 位置 方法上 作用 设置该方法为初始化方法 属性 无
知识点2:@PreDestroy
名称 @PreDestroy 类型 方法注解 位置 方法上 作用 设置该方法为销毁方法 属性 无
1.4 总结