爱游戏全站app官网入口-爱游戏官网

java开发学习(十一)-爱游戏全站app官网入口

2023-08-21,,

一、注解开发bean作用范围与管理

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

1.1 环境准备

首先准备环境:

创建一个maven项目

pom.xml添加spring的依赖


   
       org.springframework
       spring-context
       5.2.10.release
   

添加一个配置类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包==


 javax.annotation
 javax.annotation-api
 1.3.2

找不到的原因是,从jdk9以后jdk中的javax.annotation包被移除了,这两个注解刚好就在这个包中。

知识点1:@postconstruct
名称 @postconstruct
类型 方法注解
位置 方法上
作用 设置该方法为初始化方法
属性
知识点2:@predestroy
名称 @predestroy
类型 方法注解
位置 方法上
作用 设置该方法为销毁方法
属性

1.4 总结

java开发学习(十一)----基于注解开发bean作用范围与生命周期管理的相关教程结束。

网站地图