Spring核心概念、IoC和DI的认识、Spring中bean的配置及实例化、bean的生命周期

初始Spring

  • 一、Spring核心概念
    • 1.1IoC(Inversion of Contral):控制反转
    • 1.2IoC代码实现
    • 1.2DI代码实现
  • 二、bean的相关操作
    • 2.1bean的配置
      • 2.1.1bean的基础配置
      • 2.1.2bean的别名配置
      • 2.1.3bean的作用范围配置
    • 2.2bean的实例化 - - 构造方法
    • 2.3bean的实例化 - - 实例工厂与FactoryBean
    • 2.4bean的生命周期
  • 总结

一、Spring核心概念

1.1IoC(Inversion of Contral):控制反转

  • 代码书写现状
    • 耦合度偏高
  • 解决方案
    • 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象

  • IoC(Inversion of Contral):控制反转
    • 对象的创建控制权由程序转移到外部,这种思想称为控制反转
  • Spring技术对IoC思想进行了实现
    • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部
    • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
  • DI(Dependency Injection)依赖注入
    • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

1.2IoC代码实现

  • 1.导入Spring坐标
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.2.21.RELEASE</version>
</dependency>
  • 2.定义Spring管理类
package com.practice.dao;

/**
 * @Author YJ
 * @Date 2023/7/25 11:26
 * Description:
 */
public interface BookDao {
    void save();
}

package com.practice.service;

/**
 * @Author YJ
 * @Date 2023/7/25 11:28
 * Description:
 */
public interface BookService {
    void save();
}

package com.practice.service.impl;

import com.practice.dao.BookDao;
import com.practice.dao.impl.BookDaoImpl;
import com.practice.service.BookService;

/**
 * @Author YJ
 * @Date 2023/7/25 11:28
 * Description:
 */
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        bookDao.save();
    }
}

  • 3.创建Spring配置文件applicationContext.xml,配置对应类作为Spring管理的bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--1.导入spring的坐标spring-context,对应的版本号是5.2.21.RELEASE-->
    <!--2.配置bean-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl"/>
</beans>
  • 4.初始化IoC容器(Spring核心容器/Spring容器),通过容器获取bean
public class App {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        /*BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();*/
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();

    }
}

在这里插入图片描述

1.2DI代码实现

  • 1.删除业务层中使用new的方式创建的dao对象
  • 2.提供对应的setter方法
  • 3.配置service与dao的关系
    • property标签表示配置当前bean的属性
    • name属性表示配置哪一个具体的属性
    • ref属性表示参照哪一个bean
package com.practice.service.impl;

import com.practice.dao.BookDao;
import com.practice.service.BookService;

public class BookServiceImpl implements BookService {
    //删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;

    public void save() {
        bookDao.save();
    }

    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--1.导入spring的坐标spring-context,对应的版本号是5.2.21.RELEASE-->
    <!--2.配置bean-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <!--配置service与dao的关系-->
        <!--property标签表示配置当前bean的属性-->
        <!--name属性表示配置哪一个具体的属性-->
        <!--ref属性表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>

    </bean>
</beans>

在这里插入图片描述

二、bean的相关操作

2.1bean的配置

2.1.1bean的基础配置

  • 1.功能: 定义Spring核心容器管理的对象
  • 2.格式:
<beans>
	<bean/>
	<bean></bean>
</beans>
  • 3.属性:
    • 3.1id: bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
    • 3.2class: bean的类型,即配置的bean的全路径类名

2.1.2bean的别名配置

  • 别名配置就是在bean标签中添加一个name属性,这个name属性就是bean的别名,可以有多个别名中间用逗号、空格或分号隔开即可
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--1.导入spring的坐标spring-context,对应的版本号是5.2.21.RELEASE-->
    <!--2.配置bean-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl"/>
    <!--name起别名-->
    <bean id="bookService" name="service" class="com.practice.service.impl.BookServiceImpl">
        <!--配置service与dao的关系-->
        <!--property标签表示配置当前bean的属性-->
        <!--name属性表示配置哪一个具体的属性-->
        <!--ref属性表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>

    </bean>
</beans>
package com.practice;

import com.practice.dao.BookDao;
import com.practice.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author YJ
 * @Date 2023/7/25 11:33
 * Description:
 */
public class App {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        /*BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();*/
        BookService bookService = (BookService) act.getBean("service");//用到别名service
        bookService.save();

    }
}

在这里插入图片描述

  • 若是bean的名称跟配置的不一致会出现NoSuchBeanDefinitionException异常,表示该bean未定义
public class App {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        /*BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();*/
        BookService bookService = (BookService) act.getBean("service1");//用到错误别名service1
        bookService.save();

    }
}

在这里插入图片描述

2.1.3bean的作用范围配置

  • Spring默认配置的bean是一个单列的,即只有一个bean对象,如下所示:
public class AppForScope {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao1 = (BookDao) act.getBean("bookDao");
        BookDao bookDao2 = (BookDao) act.getBean("bookDao");
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}

在这里插入图片描述


  • 我们可以通过配置bean的文件控制是否产生一个对象还是多个对象
  • 通过scope属性定义bean的作用范围,可选范围如下:
    • singleton:单例(默认)
    • prototype:非单例

在这里插入图片描述


在这里插入图片描述


  • 适合交给容器进行管理的bean
    • 表现层对象
    • 业务层对象
    • 数据层对象
    • 工具对象
  • 不适合交给容器进行管理的bean
    • 封装实体的域对象

2.2bean的实例化 - - 构造方法

  • bean本质上就是对象,创建bean使用构造方法完成
public class BookDaoImpl implements BookDao {
    private BookDaoImpl() {
        System.out.println("book dao constructor running...");
    }
    public void save() {
        System.out.println("bookDao save~");
    }
}
public class App {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();
        

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--1.导入spring的坐标spring-context,对应的版本号是5.2.21.RELEASE-->
    <!--2.配置bean-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl" scope="prototype"/>
    <!--name起别名-->
    <bean id="bookService" name="service" class="com.practice.service.impl.BookServiceImpl" >
        <!--配置service与dao的关系-->
        <!--property标签表示配置当前bean的属性-->
        <!--name属性表示配置哪一个具体的属性-->
        <!--ref属性表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>

    </bean>
</beans>

在这里插入图片描述

  • 表明bean在创建时调用的无参构造方法
  • 无参构造方法如果不存在,会抛出BeanCreationException异常

2.3bean的实例化 - - 实例工厂与FactoryBean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--1.导入spring的坐标spring-context,对应的版本号是5.2.21.RELEASE-->
    <!--2.配置bean-->
    <!--方式三:使用实例化工厂实例化bean-->
    <bean id="userFactory" class="com.practice.factory.UserDaoFactory"/>
    <bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>
</beans>
public interface UserDao {
    public void save();
}
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save...");
    }
}
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

package com.practice;

import com.practice.dao.UserDao;
import com.practice.factory.UserDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author YJ
 * @Date 2023/7/25 19:09
 * Description:
 */
public class AppForInstanceUser {
    public static void main(String[] args) {
        /*//创建实例工厂对象
        UserDaoFactory userDaoFactory = new UserDaoFactory();
        UserDao userDao = userDaoFactory.getUserDao();
        userDao.save();*/
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        UserDao userDao = (UserDao) act.getBean("userDao");
        userDao.save();

    }
}

在这里插入图片描述

  • 使用FactoryBean实例化bean
package com.practice.factory;

import com.practice.dao.UserDao;
import com.practice.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;

/**
 * @Author YJ
 * @Date 2023/7/25 19:21
 * Description:使用FactoryBean实例化bean
 */
public class UserDaoFactoryBean implements FactoryBean<UserDao> {

    public UserDao getObject() throws Exception {
        //代替原始实例工厂中创建对象的方法
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--方式三:使用实例化工厂实例化bean-->
    <bean id="userFactory" class="com.practice.factory.UserDaoFactory"/>
    <bean id="userDao1" factory-bean="userFactory" factory-method="getUserDao"/>
    <!--方式四:使用FactoryBean实例化bean-->
    <bean id="userDao" class="com.practice.factory.UserDaoFactoryBean"/>

</beans>

在这里插入图片描述

  • 使用这种方式创建出的bean是单例的
    在这里插入图片描述
  • 可在UserDaoFactoryBean中实现方法isSingleton并返回false即可
public boolean isSingleton() {
        return false;
    }

在这里插入图片描述

2.4bean的生命周期

  • 生命周期:从创建到消亡的完整过程
  • bean生命周期:bean从创建到消毁的整体过程
  • bean生命周期控制:在bean创建后到销毁前做一些事情
package com.practice.dao.impl;

import com.practice.dao.BookDao;

/**
 * @Author YJ
 * @Date 2023/7/25 11:24
 * Description:
 */
public class BookDaoImpl1 implements BookDao {
    public void save() {
        System.out.println("bookDao save~");
    }
    //表示bean初始化
    public void init() {
        System.out.println("init...");
    }
    //表示bean销毁前对应操作
    public void destroy() {
        System.out.println("destroy...");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--方式三:使用实例化工厂实例化bean-->
    <!--<bean id="userFactory" class="com.practice.factory.UserDaoFactory"/>-->
    <!--<bean id="userDao1" factory-bean="userFactory" factory-method="getUserDao"/>-->
    <!--方式四:使用FactoryBean实例化bean-->
    <!--<bean id="userDao" class="com.practice.factory.UserDaoFactoryBean"/>-->
    <!--配置bean的生命周期-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1" init-method="init" destroy-method="destroy"/>
</beans>
package com.practice;

import com.practice.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author YJ
 * @Date 2023/7/25 19:40
 * Description:
 */
public class AppForLifeCycle {
    public static void main(String[] args) {
        //获取IoC容器
        ClassPathXmlApplicationContextact = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();
        //关闭容器,才能看到destory方法的执行结果
        //1.暴力关闭
        act.close();
        //2.关闭钩子
        act.registerShutdownHook();

    }
}

在这里插入图片描述

package com.practice.service.impl;

import com.practice.dao.BookDao;
import com.practice.dao.impl.BookDaoImpl1;
import com.practice.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

/**
 * @Author YJ
 * @Date 2023/7/25 11:28
 * Description:
 */
public class BookServiceImpl1 implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("service init...");
    }

    public void destroy() throws Exception {
        System.out.println("service destroy...");
    }

    public void setBookDao(BookDaoImpl1 bookDao) {
        this.bookDao=bookDao;
    }
}

package com.practice;

import com.practice.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author YJ
 * @Date 2023/7/25 19:40
 * Description:
 */
public class AppForLifeCycle {
    public static void main(String[] args) {
        //获取IoC容器
        ClassPathXmlApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookDao bookDao = (BookDao) act.getBean("bookDao");
        bookDao.save();
        //act.close();
        act.registerShutdownHook();

    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--方式三:使用实例化工厂实例化bean-->
    <!--<bean id="userFactory" class="com.practice.factory.UserDaoFactory"/>-->
    <!--<bean id="userDao1" factory-bean="userFactory" factory-method="getUserDao"/>-->
    <!--方式四:使用FactoryBean实例化bean-->
    <!--<bean id="userDao" class="com.practice.factory.UserDaoFactoryBean"/>-->
    <!--配置bean的生命周期-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1" init-method="init" destroy-method="destroy"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl1">
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

总结

关于Spring的初步认识我们就学到这里了,关于bean的操作我们有了基本的认识,欢迎各位小伙伴点赞+关注!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/49127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)

1.元素定位方法 对象的定位应该是自动化测试的核心&#xff0c;要想操作一个对象&#xff0c;首先应该识别这个对象。一个对象就是一个人一样&#xff0c;他会有各种的特征&#xff08;属性&#xff09;&#xff0c;如比我们可以通过一个人的身份证号&#xff0c;姓名&#xf…

粘包处理的方式

为什么出现粘包&#xff1a; 发送端在发送的时候由于 Nagel 算法的存在会将字节数较小的数据整合到一起发送&#xff0c;导致粘包&#xff1b;接收端不知道发送端数据的长度&#xff0c;导致接收时无法区分数据&#xff1b; 粘包处理的方式&#xff1a; 通过在数据前面加上报…

flask 实现简单的登录系统demo

你提供的代码是一个基本的Flask应用程序&#xff0c;实现了一个简单的登录系统。以下是代码的详细解释&#xff1a; 1. 导入必要的模块&#xff1a;os 用于生成密钥&#xff0c;Flask 用于创建Web应用程序。 2. 创建Flask应用程序的实例&#xff0c;并为会话管理设置一个密钥。…

如何提高自动化测试覆盖率

实施自动化测试最重要的就是要保证其可用性&#xff0c;而不少同学写了不少自动化测试用例&#xff0c;但感觉到其可用性不高。究其原因&#xff0c;不是自动化测试本身的问题&#xff0c;是实施自动化测试的时候没有考虑周全。 第一&#xff0c;不合事宜地引入自动化测试 在公…

C++ | 红黑树以及map与set的封装

目录 前言 一、红黑树 1、红黑树的基本概念 2、红黑树相关特性 3、红黑树结点的定义 4、红黑树的查找 5、红黑树的插入 6、二叉树的拷贝构造与析构 7、红黑树的检测 8、红黑树总结 二、map与set的封装 1、红黑树的结点 2、红黑树迭代器 3、set的封装 4、map的封…

一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)

首先说明一下&#xff0c;下面的流程只是个人摸索and看文档梳理出来的&#xff0c;并不作为完全正确的流程。 首先&#xff0c;注册 高德开放平台 没有注册的可以点击右上角点击注册&#xff1b; 我们点个人的就ok&#xff1b; 信息完善之后我们到控制台&#xff0c;点击 应…

使用Feign出现空指针异常

说明&#xff1a;本文记录一次偶然出现的空指针异常&#xff0c;在微服务架构中&#xff0c;一个服务在调用另一个服务时&#xff0c;出现了空指针异常。 业务描述&#xff1a;在做订单超时功能时&#xff0c;大家都知道&#xff0c;可以使用RabbitMQ延迟队列&#xff0c;下单…

二、SQL-6.DCL-2).权限控制

*是数据库和表的通配符&#xff0c;出现在数据库位置上表示所有数据库&#xff0c;出现在表名位置上&#xff0c;表示所有表 %是主机名的通配符&#xff0c;表示所有主机。 e.g.所有数据库&#xff08;*&#xff09;的所有表&#xff08;*&#xff09;的所有权限&#xff08;a…

关于Docker的基本概念和使用

关于Docker的基本概念和使用 一、Docker 概述1、Dcker的概念2、容器的优势3、Docker与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、安装 Docker1、安装依赖包2、设置阿里云镜像源3、安装 Docker-CE并设置为开机自动启动3、查看 docker 版本信息4、docker…

程序员,必须要知道的热门开源项目!

&#x1f3c6; 文章目标&#xff1a;了解热门开源项目 &#x1f340; 入门篇&#xff1a;程序员,必须要知道的热门开源项目! ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮…

Java并发编程面试题

Author 郑金维 并发编程面试题1 一、原子性高频问题&#xff1a; 1.1 Java中如何实现线程安全? 多线程操作共享数据出现的问题。 锁&#xff1a; 悲观锁&#xff1a;synchronized&#xff0c;lock乐观锁&#xff1a;CAS 可以根据业务情况&#xff0c;选择ThreadLocal&am…

PHP 3des加解密新旧方法可对接加密

一、旧3des加解密方法 <?php class Encrypt_3DES {//加密秘钥&#xff0c;private $_key;private $_iv;public function __construct($key, $iv){$this->_key $key;$this->_iv $iv;}/*** 对字符串进行3DES加密* param string 要加密的字符串* return mixed 加密成…

配置IPv4 over IPv6隧道示例

IPv4 over IPv6隧道&#xff1a; 在IPv4 Internet向IPv6 Internet过渡后期&#xff0c;IPv6网络被大量部署后&#xff0c;而IPv4网络只是散布在世界各地的一些孤岛。利用隧道技术可以在IPv6网络上创建隧道&#xff0c;从而实现IPv4孤岛的互联&#xff0c;IPv4孤岛能通过IPv6公…

基于STM32CubeMX和keil采用STM32F407的基本定时器中断实现LED闪烁

文章目录 前言1. 电路原理图理解2. 基本定时器2.1 STM32定时器中断的流程&#xff1a;2.2 部分参数详解2.2.1 时钟源2.2.2 预分频系数2.2.3 自动重装载值 3. STM32CubeMX参数配置3.1GPIO配置3.2 时钟配置3.2 配置定时器相关参数3.3 Debug配置3.4 中断配置3.5 代码生成 4. keil代…

关于Java中的Lambda变量捕获

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 一、Lambda表达式语法 二、Lambda中变量捕获 一、Lambda表达式语法 基本语法: (parameters) -> expression 或 (parameters) ->{ statements; } Lambda表达式由三部分组成&a…

小米新专利曝光:解决升降摄像头痛点,隐藏式摄像头指日可待

根据国家知识产权局官方网站的最新消息&#xff0c;小米移动软件公司的“摄像头隐藏式电子设备及隐藏式摄像头”的专利申请在今天获得了授权。 这款电子设备的主要组成部分包括壳体、摄像模组和可伸缩的反射组件。壳体上设有一个开口&#xff0c;可以让反射组件向外伸出。反射组…

美容店预约小程序制作教程详解

现在&#xff0c;制作一个专属于美容店的预约小程序不再需要编程经验&#xff0c;通过乔拓云网提供的后台管理系统&#xff0c;你可以轻松地完成整个制作过程。下面&#xff0c;我将为你详细介绍如何DIY一个美容店预约小程序。 首先&#xff0c;登录乔拓云网的后台管理系统&…

redis到底几个线程?

通常我们说redis是单线程指的是从接收客户端请求->解析请求->读写->响应客户端这整个过程是由一个线程来完成的。这并不意味着redis在任何场景、任何版本下都只有一个线程 为何用单线程处理数据读写&#xff1f; 内存数据储存已经很快了 redis相比于mysql等数据库是…

Qt完成文本转换为语音播报与保存(系统内置语音引擎)(二)

一、前言 随着人工智能技术的不断发展,语音技术也逐渐成为人们关注的焦点之一。语音技术在很多领域都有着广泛的应用,例如智能家居、智能客服、语音识别等等。其中,语音转文字技术是语音技术中的一个重要分支,它可以将语音转换成可编辑的文本,为人们的生活和工作带来了更…

中缀表达式转后缀表达式,使用逆波兰计算。可以计算小数

1、使用方法 传递一个分开保存符号与数字的List即可&#xff1a;List SumNumber; 获取参数的构造方法如下&#xff1a; public ReversePolish(List<String> sumNumber) {SumNumber sumNumber;}要求的List保存数据的方式如下&#xff1a; 例如&#xff1a;123 然后使用…