Spring中Bean的配置(一)

Spring中Bean的配置(一)

一、总述

1.1默认情况下,单纯的 Spring 环境 Bean 的作用范围有两个:Singleton 和 Prototype

● singleton:单例,默认值,Spring 容器创建的时候,就会进行 Bean 的实例化,并存储到容器内部的单例池中,每次 getBean 时都是从单例池中获取相同的 Bean 实例;

● prototype:原型,Spring 容器初始化时不会创建 Bean 实例,当调用 getBean 时才会实例化 Bean,每次 getBean 都会创建一个新的 Bean 实例。

1.2lazy-init延时加载

当 lazy-init 设置为 true 时为延迟加载,也就是当 Spring 容器创建的时候,不会立即创建 Bean 实例,等待用到时在创建 Bean 实例并存储到单例池中去,后续在使用该 Bean 直接从单例池获取即可,本质上该 Bean 还是单例的

1.3init初始化和destroy销毁

在Bena构造完成后,可以配置Bean的初始化方法和消耗方法,值得注意的是要显示的执行容器的关闭才会执行销毁方法。

二、实验

2.1默认单例


每次 getBean 时都是从单例池中获取相同的 Bean 实例

2.2原型


初始化时不会创建 Bean 实例,当调用 getBean 时才会实例化 Bean,每次 getBean 都会创建一个新的 Bean 实例。

2.3拓展:引入spring-webmvc又会有不同的四个scope

java 复制代码
 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.7</version>
        </dependency>

2.4lazy-init延时加载

java 复制代码
 <bean  id="userServiceImpl2" class="com.itheima.service.impl.UserServiceImpl2" lazy-init="true">
<!--因为方法中需要使用到userDap,所以这里是以proper的形式引入-->
<!--        方法中set什么name中就写什么-->
        <property name="userDao" ref="userDao"/>
    </bean>



当 Spring 容器创建的时候,不会立即创建 Bean 实例,等待用到时在创建 Bean 实例并存储到单例池中去,后续在使用该 Bean 直接从单例池获取。

2.5init初始化和destroy销毁

在Service中定义初始化和消耗的方法

java 复制代码
package com.itheima.service.impl;

import com.itheima.dao.UserDao;
import com.itheima.service.UserService;
import org.springframework.stereotype.Service;

//@Service("userService")
public class UserServiceImpl2 implements UserService {
    public UserServiceImpl2() {
        System.out.println("UserSevice已加载");
    }
    public void init() {
        System.out.println("UserServiceImpl2已初始化化");
    }
    public void destroy() {
        System.out.println("UserServiceImpl2已销毁");
    }
    //    先引入,便于在后面进行使用,在业务中引入接口接口,配置文件中会自己找它的实现类
    private UserDao userDao;
    @Override
    public void show2() {

    }

    @Override
    public void show1() {

    }
//    需要在Service中引入userDao,那么就定义它的set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("BeanFactory中引入的userDao为:"+userDao);
    }
}

在配置文件中进行配置

java 复制代码
<bean  id="userServiceImpl2" class="com.itheima.service.impl.UserServiceImpl2" init-method="init" destroy-method="destroy">
<!--因为方法中需要使用到userDap,所以这里是以proper的形式引入-->
<!--        方法中set什么name中就写什么-->
        <property name="userDao" ref="userDao"/>
    </bean>

没有显示关闭容器:

使用ClassPathXmlApplicationContext中的close方法进行显示关闭:

**拓展:**在创建对象后初始化的方式共有两种:

1、自己写一个初始化方法,然后在配置文件中进行指定

2、业务实现类实现InitializingBean接口,然后复写afterPropertiesSet()方法(此方法是在属性设置完成之后再进行初始化的)

在UserServiceImpl2实现InitializingBean接口,然后复写afterPropertiesSet()方法:

java 复制代码
 @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet执行");
    }

同时在setDao的时候加入打印操作,便于验证

java 复制代码
 public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("属性设置完成");
//        System.out.println("BeanFactory中引入的userDao为:"+userDao);
    }

结果:

相关推荐
咩咩啃树皮15 分钟前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny17 分钟前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦35 分钟前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny37 分钟前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚1 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
皮皮林5511 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨2 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康2 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白2 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司3 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求