当前位置: 首页 > news >正文

spring注解开发(配置bean的作用范围与生命周期)(3)

目录

一、简单spring工程(纯注解开发)环境搭建。

(1)Maven构建。spring-context依赖坐标。

(2)dao层。

(3)配置类(SpringConfig)。

(4)测试类(AppForAnnotation)。

二、注解@Scope定义bean的作用范围。

(1)基于XML配置文件:标签 的属性scope。

(2)基于纯注解开发:注解@Scope("?")。

<1>设置成单例模式(singleton)。

<2>设置成非单例模式(prototype)。(原型模式)

三、注解配置bean的生命周期(init-method、destroy-method)。

(1)基于XML配置文件的bean生命周期管理。

(2)基于纯注解式的bean生命周期管理。

<1>准备init方法和destroy方法。(模拟bean生命周期方法)

<2>注解@PostConstruct与@PreDestroy。


一、简单spring工程(纯注解开发)环境搭建。

(1)Maven构建。spring-context依赖坐标。
  • 在项目的pom文件中引入所需要的依赖坐标。
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.18</version>
        </dependency>
</dependencies>

(2)dao层。
  • 使用注解@Repository表示这个dao层的实体类,并将其交给spring管理。

  • BookDao接口。
package com.fs.dao;

public interface BookDao {
    /**
     * dao层save方法
     */
    void save();
}
  • BookDaoImpl实现类。
package com.fs.dao.impl;

import com.fs.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("book dao save...");
    }
}

(3)配置类(SpringConfig)。
  • 使用注解@Configuration标明这是一个spring的配置类。
  • 使用注解@ComponentScan让其自动扫描指定包下的类的注解。
package com.fs.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.fs.dao")
public class SpringConfig {

}
(4)测试类(AppForAnnotation)。
  • 使用类AnnotationConfigApplicationContext加载配置类初始化2个容器对象。(context1、context2)
  • 2个容器对象各自调用getBean()方法获取到BookDaoImpl实现类的bean。
  • 最后通过打印输出比较对象间的异与同。
package com.fs.test;

import com.fs.config.SpringConfig;
import com.fs.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppForAnnotation {
    public static void main(String[] args) {

        //加载配置类初始化容器对象
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        BookDao bookDao1 = context.getBean(BookDao.class);
        BookDao bookDao2 = context.getBean(BookDao.class);
        System.out.println(bookDao1);
        System.out.println("=======================");
        System.out.println(bookDao2);
    }
}
  • 当然运行结果当然是两个BookDaoImpl对象都是一样。因为spring默认管理的bean是单例的。单例的对象就是指spring工厂每次默认生产对象的只有一个且相同的。

二、注解@Scope定义bean的作用范围。

(1)基于XML配置文件:标签<bean>的属性scope。



(2)基于纯注解开发:注解@Scope("?")。
<1>设置成单例模式(singleton)。
package com.fs.dao.impl;

import com.fs.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository
@Scope("singleton")
public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("book dao save...");
    }
}

<2>设置成非单例模式(prototype)。(原型模式)
package com.fs.dao.impl;

import com.fs.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository
@Scope("prototype")
public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("book dao save...");
    }
}

三、注解配置bean的生命周期(init-method、destroy-method)。

(1)基于XML配置文件的bean生命周期管理。
  • 这里就不多说。想要详细了解可以前往博主之前的博客查看。(详细讲解)
  • spring学习(bean的生命周期与控制?)_spring 控制bean 生命周期-CSDN博客

(2)基于纯注解式的bean生命周期管理。
  • 这里通过简单的模拟bean的初始化方法和销毁方法进行学习。

<1>准备init方法和destroy方法。(模拟bean生命周期方法)
package com.fs.dao.impl;

import com.fs.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository
@Scope("singleton")
public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("book dao save...");
    }

    /**
     * 模拟初始化方法
     */
    public void init() {
        System.out.println("book init...");
    }

    /**
     * 模拟销毁方法
     */
    public void destroy() {
        System.out.println("book destroy...");
    }
}

<2>注解@PostConstruct与@PreDestroy。
  • 在之前的bean生命周期学习:通过案例的程序运行结果得知:init()初始化方法是在构造方法运行结束后才会运行。所以注解@PostConstruct看名称就能知道对应使用在初始化方法上面。
  • 而对应注解@PreDestroy也就很好解释了,“彻底销毁前”的销毁方法。
    /**
     * 模拟初始化方法
     */
    @PostConstruct
    public void init() {
        System.out.println("book init...");
    }

    /**
     * 模拟销毁方法
     */
    @PreDestroy
    public void destroy() {
        System.out.println("book destroy...");
    }
  • 注意:bean的生命周期中想要让bean触发生命周期的destroy()方法必须关闭对应的IoC容器对象close()方法或者设置registerShutdownHook()关闭钩子方法

  • 所以测试类还需稍加修改。(注意父接口ApplicationContext未直接提供close()方法)
  • 但提供close()方法的是ConfigurableApplicationContext接口下的实现类。


package com.fs.test;

import com.fs.config.SpringConfig;
import com.fs.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppForAnnotation {
    public static void main(String[] args) {

        //加载配置类初始化容器对象
        /*ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);*/

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        BookDao bookDao1 = context.getBean(BookDao.class);
        BookDao bookDao2 = context.getBean(BookDao.class);
        System.out.println(bookDao1);
        System.out.println("=======================");
        System.out.println(bookDao2);

        context.close();
    }
}
  • 测试类修改后的运行结果。

相关文章:

  • 游戏引擎学习第113天
  • DeepSeek 引领AI 大模型时代,服务器产业如何破局进化?
  • kafka-保姆级配置说明(producer)
  • 我的书包作文范文
  • java毕业设计之医院门诊挂号系统(源码+文档)
  • 第六届计算机信息和大数据应用国际学术会议(CIBDA 2025)
  • 交互编程工具之——Jupyter
  • NPM如何更换淘宝镜像——Node.js国内镜像配置教程
  • TensorFlow深度学习实战(8)——卷积神经网络
  • 基于WOA鲸鱼优化的WSN网络最优节点部署算法matlab仿真
  • 【开源】思维导图:思绪思维导图 (Simple Mind Map)
  • Windows11切换回Windows10风格右键菜单
  • 从零开始构建一个小型字符级语言模型的完整详细教程(基于Transformer架构)
  • 毕业项目推荐:基于yolov8/yolov5/yolo11的果蔬检测识别系统(python+卷积神经网络)
  • Matplotlib 高级图表绘制与交互式可视化(ipywidgets)
  • android调用ffmpeg解析rtsp协议的视频流
  • 使用BaseTypeHandler双向转换器进行加密解密
  • Spring中事务的传播行为有哪些?
  • RocketMQ事务消息是如何实现的?
  • DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑
  • 深圳做积分商城网站设计/互联网营销是做什么的
  • 做网站的结论/百度指数怎么查
  • 贵阳做网站cncolour/线上电商怎么做
  • 网络技术工程师是干什么的/微信公众号seo
  • 设置网站关键词/拉新任务接单放单平台
  • logo网站在线制作/杭州网站排名seo