2.3 Spring4 快速入门-bean 的注入与初始化和销毁

Spring Bean 生命周期全解析:从初始化到销毁的完整流程 生命周期阶段:从 Aware 接口回调到销毁方法,共 10 个关键步骤。自定义方法的价值:通过和实现解耦的初始化/销毁逻辑。流程控制:理解执行顺序,避免逻辑冲突(如重复资源释放)。 阅读详情

本章写的主要是bean的三种初始化与注销方式及几个注解组件。
初始条件:
1. Java version : 1.8
2. maven version : 1.3.9
3. IDE: IDEA

第1步: 创建简单形式的 Maven 工程(quick starter)。
第2步:在 POM 文件中加入 Spring5 的依赖。

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.0.RELEASE</version>
 </dependency>

第3步: 创建 User 类作为 bean,加上 @Component 作为 Spring 的一个组件。

import org.springframework.stereotype.Component;

@Component
public class User {
private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
 }

第4步: 创建主类 App (含有main的可执行程序),加上@ComponentScan,让 Spring 自动去扫描当前包及其子包里面带有 @Component @Configuration 等注解的类,并加载为组件(bean).

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class App 
{
    public static void main( String[] args )
    {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(App.class);
        System.out.println(ctx.getBean(User.class));
        System.out.println("User ID --- > " + ctx.getBean(User.class).getId());
        ctx.close();
    }
}

此时 User 类并没有初始化,运行程序输出的是:

com.test.User@58fdd99
User ID --- > null

bean 的初始化及销毁方式一

使 User 类继承 Spring 自带的初始化与销毁组件 InitializingBean(初始化),DisposableBean(销毁),并继承其方法。

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class User implements InitializingBean,DisposableBean{
private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    /* User bean 初始化操作 */
    public void afterPropertiesSet() throws Exception {
        System.out.println("<--------User bean 初始化-------->");
        id = "ID_0000001";
    }
    /* User bean 销毁操作 */
    public void destroy() throws Exception {
        System.out.println("<--------User bean 销毁-------->");
    }
}

在上面的初始化代码中,使 User.id 初始化为 id=“ID_0000001”,运行程序的结果是:

<--------User bean 初始化-------->
com.test.User@709ba3fb
User ID --- > ID_0000001
<--------User bean 销毁-------->

bean 的初始化及销毁方式二

只需要修改上面的 User 类,使用 @PostConstruct(初始化)
@PreDestroy (销毁)注解声明方法。

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class User {
private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    /* 初始化方法 */
    @PostConstruct
    public void init() throws Exception {
        System.out.println("<--------User bean 初始化-------->");
        id = "ID_0000001";
    }

    /* 销毁方法 */
    @PreDestroy
    public void destroy() throws Exception {
        System.out.println("<--------User bean 销毁-------->");
    }
}

运行主类 App 结果输出:

<--------User bean 初始化-------->
com.test.User@525b461a
User ID --- > ID_0000001
<--------User bean 销毁-------->

bean 的初始化及销毁方式三

  1. 修改 User 类:
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class User {
private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void init() throws Exception {
        System.out.println("<--------User bean 初始化-------->");
        id = "ID_0000001";
    }

    public void destroy() throws Exception {
        System.out.println("<--------User bean 销毁-------->");
    }
}
  1. 新建 UserConfig 配置类,在声明 bean 时指定 User 的初始化与销毁方法。
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {

    @Qualifier("getUser")
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public User getUser(){
        return new User();
    }
}
  1. 修改 App 主类:
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
public class App 
{
    public static void main( String[] args )
    {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(App.class);

        System.out.println("UserConfig --- > " + ctx.getBean(UserConfig.class).getUser().getId());
        System.out.println("User ID --- > " + ctx.getBean("getUser"));

        ctx.close();
    }
}

结果输出:

<--------User bean 初始化-------->
UserConfig --- > ID_0000001
User ID --- > com.test.User@145eaa29
<--------User bean 销毁-------->


@Component、@Repository、@Service、@Controller
的作用都是将类标识为 bean 。只是它们在应用时用在不同的地方,已做层次上的区分。
Component : 用于普通的类。
Repository : 用于 dao 层。
Service : 用于service 层。
Controller : 用于 Controller。

  1. Repository 示例:
import org.springframework.stereotype.Repository;

@Repository  
public class UserDao {
}
  1. Service 示例:
import org.springframework.stereotype.Service;
@Service
public class UserService {
}
  1. Controller 示例:
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
}

注入bean,使用 Autowired  / Resource(JSR-250) / Inject (JSR-330 ,需要额外添加javax.inject 依赖) 

  1. 在 Controller 中 注入 Service :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private UserService userService;
}
  1. 在 Service 中 注入 Dao :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
}

可能存在的问题

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.test.User' available: expected single matching bean but found 2: user,getUser

在注入 bean 的时候可能提示存在多个相同类型的bean,此时可以使用 @Primary 声明目标bean,这个注解的意思是,如果系统找到多个相同类型的bean,会首先来取有Primary  声明的bean,用来解决存在bean的注入失败问题。

手把手教你用运放搭建方波三角波发生器(附Multisim仿真文件) 本文详细解析了使用运算放大器搭建方波和三角波发生器的核心原理与设计步骤。通过剖析迟滞比较器与积分器的联动机制,指导读者进行电路设计、元件选型,并借助Multisim仿真进行参数调优与波形优化。文章提供了从理论分析、虚拟仿真到实物焊接调试的完整实践指南,并附有仿真文件,帮助硬件爱好者与初学者深入掌握这一经典模拟电路设计。 阅读详情

相关推荐

【SOC估计】基于EKF与二阶RC等效电路模型的锂电池SOC在线估计算法实现与仿真分析

本文详细介绍了基于扩展卡尔曼滤波(EKF)与二阶RC等效电路模型的锂电池SOC在线估计算法。通过Matlab仿真分析,展示了该算法如何实现高精度SOC估计,相比传统方法显著提升估计精度与鲁棒性,适用于电动汽车、储能系统等关键领域。

1093

Spring中bean的初始化和销毁几种实现方式详解

Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – ….– 销毁前操作 – 销毁方法的调用。 【1】init-method和destroy-method 两种方式,xml配置和注解。 ① xml配置: &amp;amp;amp;amp;lt;bean id=&amp;amp;amp;quot;person&amp;amp;amp;quot; class=&a

小小默:进无止境 2万+

【项目实战】基于STM32单片机的智能小车设计(有代码)

【1】背景意义 近些年随着国民生活水平的提升,以小车为载体的轮式机器人进入了我们的生活,尤其是在一些布线复杂困难的安全生活区和需要监控的施工作业场合都必须依赖轮式机器人的视频监控技术。因此,基于嵌入式技术的无线通信视频监控轮式机器人应运而生。由于它们与人类工作相比具有成本低廉、安全稳定的优点,目前已经在许多危险作业以及工业场合得到了广泛应用而且轮式机器人不需要像人那样采取过多的保护措施,因此轮式机...

ShawnWang1994的博客 13万+

【Spring高级】Bean的初始化和销毁有哪些方式

Spring中Bean的初始化和销毁有哪些方式

qq_43745578的博客 1902

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

HI3516CV610海思SOC:超高清智慧视觉开发全攻略

本文全面解析海思HI3516CV610 SOC在超高清智慧视觉开发中的应用。该芯片集成双核A7处理器、1Tops NPU、AI ISP及4K视频编码器,专为智能摄像头设计。文章详细介绍了开发环境搭建、核心硬件架构、媒体处理平台(MPP)实战、AI算法集成与系统调优等全流程攻略,帮助开发者高效构建稳定可靠的视觉AI产品。

weixin_29269441的博客 1251

Spring5 - Bean的初始化和销毁的4种方式

文章目录概述方式一: 自行指定bean的初始化方法和bean的销毁方法方式二: 通过 InitializingBean和DisposableBean 接口实现bean的初始化以及销毁方法方式三: 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法方式四:通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程 概述 针对单实例bean的话,容器启动的时候,bean的对象就创建了,而且容器销毁的时候,也会调用B

小工匠 2万+

revit二次开发环境搭建(2024版)(小白友好)

revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程

m0_56961251的博客 1419

Spring中Bean初始化和销毁的多种方式

详细介绍多种初始化Bean和销毁Bean的方式

初心不忘、始终方得 2476

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 678

终于找到了!Ubuntu 虚拟机卡死的终极解决方案(如何解决VMware安装Ubuntu24.04桌面进不去、黑屏、虚拟机卡死、显示不全、屏幕闪烁等问题)

终于找到了!Ubuntu 虚拟机卡死的终极解决方案(如何解决VMware安装Ubuntu24.04桌面进不去、黑屏、虚拟机卡死、显示不全、屏幕闪烁等问题)

XiaoqiangClub的博客 1万+

Spring Bean 源码解析初始化与销毁通,与循环依赖问题

Bean 的生命周期一. 自定义 bean 的初始化与销毁逻辑@Bean 设置 bean 的初始化与销毁时需要执行的方法InitializingBean 与 DisposableBean 接口方式指定执行与销毁时需要执行的方法JSR250 注解指定初始化前与销毁前要执行的方法BeanPostProcessor , bean 的后置处理器二. 通过 bean 的后置处理器,了解 bean 的生命周期...

qq_29799655的博客 1150

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java bean初始化方法,Spring中bean的初始化和销毁几种实现方式详解

Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – …-- 销毁前操作 – 销毁方法的调用。【1】init-method和destroy-method自定义初始化方法和销毁方法两种方式:xml配置和注解。① xml配置class="com.core.Person" scope="singleton"init-metho...

weixin_31592801的博客 1217

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring IoC容器初始化源码(8)—populateBean、initializeBean填充Bean、字段反射和setter方法依赖注入以及IoC容器初始化总结【四万字】

基于最新Spring 5.x,详细介绍了bean的“初始化过程”,主要包括applyMergedBeanDefinitionPostProcessors、populateBean、initializeBean、registerDisposableBeanIfNecessary核心方法,最后对Spring IoC容器初始化进行了总结!

终生学习践行者 5189

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring框架中Bean的加载和初始化顺序

在Spring框架中,Bean的加载和初始化过程是一个复杂而细致的过程,涉及多个阶段和扩展点。在我们日常开发中也会用到相关的知识,所以我们必须了解

DongJiYong_20的博客 1458

Spring中 Bean的初始化和销毁

1.应用场景 在实际开发中,经常会遇到在bean使用前或者使用后做些必要的操作。 补充:个人之前有遇到的情况是对工具类进行DI注入,即工具类中某个属性是需要进行配置的,是灵活可变的, spring对bean的生命周期的操作提供了支持,在使用java配置和注解配置下提供两种方式 1.java配置 2.注解 2.两种方式 1 .java配置方式:使用@Bean的initMethod 和 destroyMethod (相当于xml配置的init-method和destroy-method) 2.注解方式:利用

qq_33304139的博客 379

深入学习Spring Bean生命周期(Bean的初始化销毁以及BeanPostProcessor)

所谓Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。 1. Bean的初始化和销毁 在整个生命周期过程中,我们可以自定义Bean的初始化和销毁钩子函数,当Bean的生命周期到达相应的阶段的时候,Spring会调用我们自定义的Bean的初始化和销毁方法。自定义Bean初始化和销毁方法有多种方式,下面逐一介绍。 1.1 @Bean 在 深入理解Spring组件注册 中介绍了可以在配置类中通过@Bean注解来注册Bean,我们也可以通过它来指定Bean的初始化

Java是世界上最好的语言 1005

Spring Bean初始化

执行顺序实现InitializingBean接口,重写afterPropertiesSet方法元素上添加init-method初始化使用@PostConstruct注解Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。https。...

Shawn的个人博客 4241

2021.10.28,Spring学习Bean构造、设置注入,单例多例,懒加载,初始化和销毁

1、Spring基础讲解 Spring是一种松耦合的对象创建和对象关系管理的框架。 业务层框架 持久层框架:Mybatis、Hibernate 非侵入式:系统中原来已经写好了很多类,现在引入一种新技术框架可以使用。在使用新框架的同时,原来的类不需要改动(不需要继承、实现新框架中的接口)。框架:Spring、Hibernate、Mybatis 入侵式:系统中原来已经写好了很多类,现在引入了一种新技术框架可以使用。在使用新框架的同时,原来的类需要改动。如:Struts,Servlet IoC与DI: IoC:(

qq_45766098的博客 571

Spring bean的初始化及销毁

Spring bean的初始化及销毁 https://www.cnblogs.com/larryzeal/p/5520665.html Spring bean的几个属性:scope、init-method、destroy-method、depends-on等。 Scope 在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。 scope分类:singl...

236

Spring Bean 的生命周期:从创建到销毁的完整旅程

Spring Bean 的生命周期是 Spring 框架的核心概念之一,理解这个过程对于编写高效的 Spring 应用程序至关重要。一个 Bean 从创建到销毁经历了多个阶段,每个阶段都提供了扩展点允许开发者进行自定义操作。// Bean 定义可以通过多种方式加载@Bean// 或使用注解方式@Component// ...

qq_74898152的博客 1931

spring bean的生命周期是什么?一文读懂 Spring Bean 的生命周期:从创建到销毁的全流程

在 Spring 中,Bean 是指由 Spring 容器实例化、组装和管理的对象。它们是 Spring 采取控制反转(IoC)和依赖注入(DI)理念的具体实现。简单来说,Spring Bean 是你在应用中使用的任何组件,比如服务类、数据访问类等。在这篇博客中,我们详细介绍了 Spring Bean 的生命周期以及相关的代码示例。希望能帮助你在实际开发中更好地使用 Spring 框架。如果你还有其他问题或者对某个部分需要更深入的了解,请随时留言,我们将一起探讨!

智通全网络工作室的博客 1667

Spring的bean的生命周期——bean的创建与销毁

aop:如果有aop则创建的bean是代理对象,执行流程是userService.test() --> aop切面逻辑如@before--> target.test()。aop流程:找所有的切面类@Aspect、找切面中所有的pointCut,如@before@after等,看当前要创建的bean是否是pointCut需要的,是就创建代理对象。创建出来的bean如果是单例,放到map中,key是bean名称,value是bean对象。从类信息map中获取beanDefinition,并加载类。

Y_Tinty的博客 979

如何快速将 Qwopus3.8-27B-Flash-mxfp8-MLX 部署为 API 服务:本地 OpenAI 兼容推理接口完整指南

🚀 本文带你用 **3 步** 将 Qwopus3.8-27B-Flash-mxfp8-MLX(27B 多模态模型的 mxfp8 量化 MLX 版本)部署为 API 服务,在本地搭建一个 **OpenAI 兼容推理接口**,让现有代码只需改一行 `base_url` 即可直连调用。 ## 一、先认识这个模型:为什么适合本地部署 Qwopus3.8-27B-Flash-mxfp8-MLX 是一

gitblog_00824的博客 926

Spring源码学习(3)-bean的加载与销毁

Spring源码学习--bean的加载bean的加载FactoryBean的使用缓存中获取单例的bean从bean的实例中获取对象获取单例准备创建bean循环依赖创建bean创建bean的实例属性注入初始化bean bean的加载 protected <T> T doGetBean(final String name, @Nullable final Class<T> re...

Zzzzz_xh的博客 372

Spring的Bean声明、初始化、使用、销毁

Bean是由Spring IoC容器实例化、组装和管理的对象。 先通过一个简单的例子来了解把对象声明为Bean的作用。 1. Bean声明 在applicationContext.xml中配置bean的定义 <bean id="screwDriver" class="com.pxy.ScrewDriver"></bean> //ScrewDriver.java publi...

buptpxy的博客 489
上一篇: 2.2 Spring boot 配置分析 - 通过工厂方式注入bean
下一篇: 3. Spring Boot 初步了解
git_DingSJ
博客等级 码龄10年 14粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值