• Java开发学习(十一)----基于注解开发bean作用范围与生命周期管理


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

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

    1.1 环境准备

    首先准备环境:

    • 创建一个Maven项目

    • pom.xml添加Spring的依赖

      <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 总结

     



    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    开始学习React——跟着官网做井字棋
    2023年【安徽省安全员C证】考试及安徽省安全员C证找解析
    腾讯待办是什么?关停之后如何继续提醒待办事项?
    Python列表详解
    torchvision.datasets.ImageFolder使用详解
    MySQL执行计划explain
    【科学文献计量】文本主题挖掘与可视化
    中勒索病毒怎么处理想恢复数据
    智能合约漏洞,Euler Finance 价值 1.95 亿美元漏洞事件分析
    校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/16324427.html