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

导读:本篇文章讲解 [Spring Framework]注解开发②(注解配置scope、生命周期钩子),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

也许你感觉自己的努力总是徒劳无功,但不必怀疑,你每天都离顶点更进一步。今天的你离顶点还遥遥无期。但你通过今天的努力,积蓄了明天勇攀高峰的力量。加油!

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中添加两个方法,initdestroy,方法名可以任意

@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
类型 方法注解
位置 方法上
作用 设置该方法为销毁方法
属性

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122085.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!