spring bean

news2024/11/28 16:44:41

图灵课堂学习笔记

1. BeanFactory与ApplicationContext的关系

p56

  1. ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;
  2. beanFactory容器对象:提供对于bean基本操作能力。查找bean 存储bean。
  3. applicationContext不仅继承了Beanfactory,而且还维护了beanfactory的引用。
  4. bean 的初始化时间不一样。BeanFactory 是首次调用getBean()时才进行Bean 的创建。Application 是在配置文件加载,容器一创建Bean就实例化初始化好了。

1.1 beanfactory 和 application 继承体系

BeanFactory 实现->DefaultListableBreanFactory
ApplicationContext

1.2 bean 范围 初始化

  • @scope
    • signleton、prototype

1.3 初始化 实现 InitializingBean

  • InitializingBean初始化
    afterPropertiesSet() 在属性注入之后执行。 类似于在注入dao后,再执行
  • DisposableBean 销毁
    destroy()

除此之外,我们还可以通过实现 InitializingBean 接口,完成一些Bean的初始化操作,如下:

构造方法、注解postConstruct,实现InitializingBean方法afterPropertiesSet,bean初始化init方法执行顺序。
通过启动日志我们可以看出执行顺序优先级:构造方法 > postConstruct >afterPropertiesSet > init方法。

@Component
public class MyInitializingBean implements InitializingBean {

    public MyInitializingBean() {
        System.out.println("我是MyInitializingBean构造方法执行...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("我是afterPropertiesSet方法执行...");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("我是postConstruct方法执行...");
    }

    public void init(){
        System.out.println("我是init方法执行...");
    }

    @Bean(initMethod = "init")
    public MyInitializingBean test() {
        return new MyInitializingBean();
    }
}

3

1.4 实例化bean 方式 factoryBean

  • 静态工厂方法实例化Bean
  • 实例工厂方法实例化Bean
  • 实现FactoryBean规范延迟实例化Bean

public class MyFactoryBean implements FactoryBean<User> {
    /**
     * 返回bean
     *
     * @return
     * @throws Exception
     */
    @Override
    public User getObject() throws Exception {
        User user = new User();
        user.setId(1L);
        user.setName("zhangsan");
        return user;
    }
    /**
     * 返回bean 的类型 class
     *
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
}

1.5 spring的get 方法

Spring 的get方法
3

// 根据 beanName 获取容器中的 Bean 实例,需要手动强转
UserService userService = (UserService) applicationContext
	.getBean("userService");
// 根据 Bean 类型去容器中匹配对应的 Bean 实例,如存在多个匹配 Bean 则报错
UserService userService2 = applicationContext
	.getBean(UserService.class);
// 根据 beanName 获取容器中的 Bean 实例,指定 Bean 的 Type 类型
UserService userService3 = applicationContext
	.getBean("userService",
UserService.class);

2.Bean 实例化的基本流

ioc p119
singletonObjects 单例池

  • beanfactory :
    • signletonObjects 单例池
    • beandifinitionMap bean定义集合

简化说:

  • 加载xml配置文件,解析获取配置中的每个的信息,封装成一个个的BeanDefinition对象;
  • 将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中;
  • ApplicationContext底层遍历beanDefinitionMap,创建Bean实例对象;
  • 创建好的Bean实例对象,被存储到一个名为singletonObjects的Map<String,Object>中;
  • 当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例返回。

BeanDefinition

Spring容器在进行初始化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,所有的BeanDefinition存储到一个名beanDefinitionMap的Map集合中去,Spring框架在对该Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储在一个名为singletonObjects的Map集合中当调用getBean方法时则最终从该Map集合中取出Bean实例对象返回

3

beandifiniton:保存了bean的信息,比如beanclass,是否单例,是否懒加载。

2.1 spring 的后处理器

以达到动态注册BeanDefinition动态修改BeanDefinition以及动态修改Bean的作用。Spring主要有两种后处理器:
⚫ BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕Bean实例化之前执行; 执行一次
⚫ BeanPostProcessor:Bean后处理器,一般在Bean实例化之后填充到单例池singletonObjects之前执行。每个bean 实例化后都执行一次。

2.1.1 bean工厂的后置处理器 BeanFactoryPostProcessor

Bean工厂后处理器 – BeanFactoryPostProcessor
可以注册beandefinition
BeanFactoryPostProcessor是一个接口规范,实现了该接口的类只要交由Spring容器管理的话,那么Spring就会回调该接口的方法,用于对BeanDefinition注册和修改的功能。

@Component
public class MyBeanFactoryPostProcessor  implements BeanFactoryPostProcessor {
    /**
     * @param beanFactory  BeanFactory的子接口  其实是 DefaultListableBeanFactory
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //动态注册BeanDefinition 是个接口  使用RootBeanDefinition
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClassName("com.hyp.pojo.User");
//        rootBeanDefinition.setBeanClass(User.class);
        // 没有注册到beanDefinitionmap中的方法
        //通过beanFactory 强转 DefaultListableBeanFactory   
        DefaultListableBeanFactory defaultListableBeanFactory=
                (DefaultListableBeanFactory) beanFactory;
        //注入注册到beanDefinitionmap中
        defaultListableBeanFactory.registerBeanDefinition("user001",rootBeanDefinition);
    }
}

2.1.2 专门注册beandefinition 的bean工厂后置处理器

提供了一个BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcessor专门用于注册BeanDefinition操作

@Component
public class MyBeanDefinitionRegistyPostProcessor implements BeanDefinitionRegistryPostProcessor {
    /**
     * 本类实现,用来快速注册beandefinition 的方法
     * @param registry
     * @throws BeansException
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        //动态注册BeanDefinition 是个接口  使用RootBeanDefinition
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClassName("com.hyp.pojo.User");
//        rootBeanDefinition.setBeanClass(User.class);
        registry.registerBeanDefinition("user001",rootBeanDefinition);
        System.out.println("先被调用");
    }

    /**
     * BeanFactoryPostProcessor 的方法
     * @param beanFactory
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("后被调用");
    }
}

3

2.2 bean 的后置处理器

Bean后处理器 – BeanPostProcessor
每个类都调用一次

Bean被实例化后,到最终缓存到名为singletonObjects单例池之前中间会经过Bean的初始化过程,例如:属性的填充初始方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后处理。跟上面的Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor,会在流程节点上被Spring自动调用

3

2.3 bean 的生命周期

p145
Spring Bean的生命周期是从 Bean 实例化之后(反射创建对象),即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段:

  • Bean的实例化阶段

Spring框架会取出BeanDefinition的信息进行判断(各种if的判断)当前Bean的范围是否是singleton的是否不是延迟加载的是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;

  • Bean的初始化阶段:·

Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充执行一些Aware接口方法执行BeanPostProcessor方法执行InitializingBean接口的初始化方法执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段,Aop增强功能,后面要学习的Spring的注解功能等、spring高频面试题Bean的循环引用问题都是在这个阶段体现的;

  • Bean的完成阶段

经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池 singletonObjects中去了,即完成了Spring Bean的整个生命周期。

2.3.1 生命周期步骤

  • bean 的属性填充
  • Aware接口的属性注入 如果自己实现aware接口,spring会注入属性
  • BeanPostProcessor before() 方法
  • @PostConstruct() 方法
  • InitializingBean 接口的初始化方法
  • 自定义初始化方法 回调 initMethod=“”
  • BeanPostProcessor after() 方法调用

2.3.2 属性填充

BeanDefinition 中有对当前Bean实体的注入信息通过属性propertyValues进行了存储,

3

属性注入的三种情况。

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
  • 注入单向对象引用属性时,(user类需要注入userDao类,userDao容器中没有)从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
  • 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖)问题

循环依赖问题

3
3

解决

	// 1.一级缓存 单例池map 最终存储完整bean成品的容器 初始化和实例化都完成的bean
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

	//2.二级缓存 bean 不是完整的bean 还没有完全初始化
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

	// 3.单例 Bean 的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建 Bean ,称之为 " 三级缓存
	//半成品bean 包装一个ObjectFactory 未被别人引用,创建对象就注入进去。
	// UserDao通过第三级缓存获取到了对象(user) 将该对象(user) 注入到获取UserDao中,把user从第三级缓存移除,user注入到第二级缓存中。
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);


UserService和UserDao循环依赖的过程结合上述三级缓存描述一下
⚫ UserService 实例化对象,但尚未初始化,将UserService存储到三级缓存;
⚫ UserService 属性注入,需要UserDao,从缓存中获取,没有UserDao;
⚫ UserDao实例化对象,但尚未初始化,将UserDao存储到到三级缓存;
⚫ UserDao属性注入,需要UserService,从三级缓存获取UserService,UserService从三级缓存移入二级缓存;
⚫ UserDao执行其他生命周期过程,最终成为一个完成Bean,存储到一级缓存,删除二三级缓存;
⚫ UserService 注入UserDao;
⚫ UserService执行其他生命周期过程,最终成为一个完成Bean,存储到一级缓存,删除二三级缓存。

3

2.3.3 aware 接口

Aware接口回调方法作用
ServletContextAwaresetServletContext(ServletContext context)Spring框架回调方法注入ServletContext对象,web环境下才生效
BeanFactoryAwaresetBeanFactory(BeanFactory factory)Spring框架回调方法注入beanFactory对象
BeanNameAwaresetBeanName(String beanName)Spring框架回调方法注入当前Bean在容器中的beanName
ApplicationContextAwaresetApplicationContext(ApplicationContext applicationContext)Spring框架回调方法注入applicationContext对象

2.3 ioc 整体流程

3

3 整合mybatis

  • 配置SqlSessionFactoryBean
    作用 将sqlSessionFactory 存储到spring 容器中

  • MapperScannerConfigurer
    作用 扫描指定包,产生mapper对象存储到spring 容器

3.1 原理

P166
Spring整合MyBatis的原理剖析
整合包里提供了·一个SqlSessionFactoryBean一个扫描Mapper的配置对象,SqlSessionFactoryBean一旦被实例化,就开始扫描Mapper并通过动态代理产生Mapper的实现类存储到Spring容器中。相关的有如下四个类:

  1. SqlSessionFactoryBean:需要进行配置,用于提供SqlSessionFactory;
  • 解释
    配置SqlSessionFactoryBean作用是向容器中提供SqlSessionFactory,SqlSessionFactoryBean实现了FactoryBeanInitializingBean两个接口,所以会自动执行getObject() 和afterPropertiesSet()方法
SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean{
public void afterPropertiesSet() throws Exception {
// 创建 SqlSessionFactory 对象
this.sqlSessionFactory = this.buildSqlSessionFactory();
}
public SqlSessionFactory getObject() throws Exception {
return this.sqlSessionFactory;
}
}
  1. MapperScannerConfigurer:需要进行配置,用于扫描指定mapper注册BeanDefinition;

配置MapperScannerConfigurer作用是扫描Mapper,向容器中注册Mapper对应的MapperFactoryBean,MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessorInitializingBean两个接口,会在postProcessBeanDefinitionRegistry方法中向容器中注册MapperFactoryBean

  1. MapperFactoryBean:Mapper的FactoryBean,获得指定Mapper时调用getObject方法;
  2. ClassPathMapperScanner:definition.setAutowireMode(2) 修改了自动注入状态,所以MapperFactoryBean中的setSqlSessionFactory会自动注入进去。

PS:autowireMode取值:1是根据名称自动装配,2是根据类型自动装配

4.注解

4.1 注解依赖注入

xml配置 注解 描述

注解描述
@Scope在类上或使用了@Bean标注的方法上,标注Bean的作用范围,取值为singleton或prototype
@Lazy在类上或使用了@Bean标注的方法上,标注Bean是否延迟加载,取值为true和false
@PostConstruct在方法上使用,标注Bean的实例化后执行的方法
@PreDestroy在方法上使用,标注Bean的销毁前执行方法

容器中有多个Userdao 可以注入List
3

3

属性注入注解描述
@Value使用在字段或方法上,用于注入普通数据
@Autowired使用在字段或方法上,用于根据类型(byType)注入引用数据 ·默认通过byType方式注入
@Qualifier使用在字段或方法上,结合@Autowired,根据名称注入
@Resource使用在字段或方法上,根据类型或名称进行注入 默认通过byName方式注入

//通过@Value 注入properties文件中的属性

@Value("haohao")
private String username;
@Value("haohao")
public void setUsername(String username){
System.out.println(username);
}


@Value("${jdbc.username}")
private String username;
@Value("${jdbc.username}")
public void setUsername(String username){
System.out.println(username);
}


4.2 非自定义bean注解开发

非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化,使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称

// 将方法返回值 Bean 实例以 @Bean 注解指定的名称存储到 Spring 容器中
@Bean("dataSource")
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}

// 使用@Qualifier 根据名称进行Bean的匹配;
// 使用@Value 根据名称进行普通数据类型匹配。
@Bean
public Object objectDemo02(@Qualifier("userDao") UserDao userDao,
@Value("${jdbc.username}") String username){
System.out.println(userDao);
System.out.println(username);
return new Object();
}

4.3 Spring 配置类开发

@Configuration 注解标识的类为配置类,替代原有xml配置文件,
该注解第一个作用是标识该类是一个配置类
第二个作用是具备@Component作用

@PropertySource 注解用于加载外部properties资源配置,替代原有xml中的 <context:property-
placeholder location=“”/> 配置

@Import 用于加载其他配置类

@import使用:

  • ①直接编写到@Import中,并且id值 是全类名
  • ②自定义ImportSelector接口的实现类,通过selectimports方法实现(方法的返回值 就是要纳入IoC容器的Bean) 。 并且 告知程序 自己编写的实现类。
    @Import({Orange.class,MyImportSelector.class})
  • ③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法
    @Import({Orange.class,MyImportSelector.class,ImportBeanDefinitionRegistrar.class})
@PropertySource({"classpath:jdbc.properties","classpath:xxx.properties"})
@Configuration
@ComponentScan("com.hyp")
public class SpringConfiguration {

}

4.3.1 import的使用 原理链接

链接@Import 学习使用

  1. 普通导入Bean.class
@Import(value = {User.class})
public class SpringConfiguration {}
  1. importSelector
public class MyImportSelector  implements ImportSelector {
	/**
	 * 为什么要使用ImportSelector?
	 * ImportSelector在SpringBoot中大量被使用,
	 * 各种@EnableXXX注解表示开启XXX,这些注解基本上都是使用了@Import注解导入一个ImportSelector。
	 * 比如需要开启Eureka,开启Nacos,只需要简单的一行注解就能搞定。
	 * @param importingClassMetadata
	 * @return
	 */
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		//数组中放入需要引入spring中的类名
		return new String[]{Test.class.getName()};
	}
}

然后创建一个自定义注解 @EnableTest:

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MySelector.class)//引入MySelector.class
public @interface EnableTest {
}


最后创建一个App用来测试:

@EnableTest//这里加上EnableTest注解
public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(App.class);

        System.out.println(ac.getBean(Test.class));//测试是否能够从容器中获取到外部的Test的对象。
    }
}

测试结果肯定是能够获取到的!

为什么要使用ImportSelector?
ImportSelector在SpringBoot中大量被使用,各种@EnableXXX注解表示开启XXX,这些注解基本上都是使用了@Import注解导入一个ImportSelector。
比如需要开启Eureka,开启Nacos,只需要简单的一行注解就能搞定。

  1. ImportBeanDefinitionRegistrar

4.4 注解解析原理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python带你制作可以随机的自答题程序

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录前言环境使用:模块使用:程序实现思路: <模板> 获取题库一. 获取题库 --> 问题答案二. 进行自动答题操作代码展示题库采集自动答题尾语 &#x1f49d;环境使用: 解释器版本 >>> python 3.8 代码编辑器…

数学基础|线性代数回顾

因为学机器学习的时候发现自己线性代数忘光光了&#xff08;悲&#x1f613;&#xff0c;本篇捞一捞当年学线性代数看哔哩哔哩宋浩老师补充记的潦草笔记。 目录 &#x1f4da;线性代数知识点 &#x1f407;向量 &#x1f955;向量的线性组合 &#x1f955;线性相关无关的性…

JVM 工作原理和即时编译(JIT)

目录 1、什么是虚拟机&#xff1f; 2、JVM 虚拟机简介 3、JVM 的工作原理 4、什么是即时编译&#xff08;JIT&#xff09;&#xff1f; 5、解释型语言和编译型语言的区别 6、为什么说 Java 是一种半编译半解释的语言&#xff1f; 1、什么是虚拟机&#xff1f; 虚拟机是一…

直播美颜技术的演进及其应用:直播美颜SDK详解

直播美颜技术的应用&#xff0c;为直播开辟了新的业态&#xff0c;从最初简单的美颜滤镜&#xff0c;到现在的直播美颜SDK&#xff0c;其技术演进历程也是一步步走来。 一、直播美颜技术的演进 1、简单美颜滤镜 最初的直播美颜技术&#xff0c;就是通过简单的美颜滤镜来实现…

python内存回收gc模块

目录1. python 垃圾回收机制标记-清除的回收机制分代回收2. gc 模块参考资料对已经销毁的对象&#xff0c;Python不会自动释放其占据的内存空间。为了能够充分地利用分配的内存&#xff0c;避免程序跑到一半停止&#xff0c;要时不时地进行内存回收&#xff0c;这时候gc&#x…

超详细——Python中 pip 常用命令

人生苦短&#xff0c;我学Python 相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中…

每天一道大厂SQL题【Day19】华泰证券真题实战(一)

每天一道大厂SQL题【Day19】华泰证券真题实战(一) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

CSS中相对定位与绝对定位的区别及作用

CSS中相对定位与绝对定位的区别及作用场景复现核心干货相对定位绝对定位子绝父相&#x1f525;&#x1f525;定位总结绝对定位与相对定位的区别场景复现 在学习前端开发的过程中&#xff0c;熟练掌握页面布局和定位是非常重要的&#xff0c;因此近期计划出一个专栏&#xff0c…

【问题、AI解答】mongodb中使用$lookup进行连表查询使用_id作为localField出现查询结果字段为空的情况

描述&#xff1a; db.acticles.aggregate([ {$lookup&#xff1a;{from:"acticlesMaptags",localField:"_id",foreignField:"acticleid",as:"tagid"} } ])acticlesMaptags集合中的acticleid字段存在与acticles集合中的_id相匹配的数据…

1.15 从0开始学习Unity游戏开发--游戏UI

上一章中&#xff0c;我们剩下最后一个任务&#xff0c;需要支持鼠标控制准心来进行设计&#xff0c;那么准心本质上就是一个始终呈现在屏幕上的一个图片&#xff0c;你当然可以用一个3D物体来制作&#xff0c;之前讲解渲染概念的时候也提到过&#xff0c;我们的屏幕就是相机的…

传智健康_day3

本章对检查组管理进行开发 一.新增检查组 1.修改新增弹层可见属性&#xff0c;添加重置表单功能 2.动态刷新检查组包含的检查项信息 <tr v-for"c in tableData"> 使用for循环来遍历查询出tableData中的数据 tableData是一个数组对象&#xff0c;定义在VUE…

hadoop分布式安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 远程传输5.1 scp远程传输6. 免密登录7. 集群规划8. 修改自定义配置文件8.1 hadoop-env.sh8.2 core-site.xml8.3 hdfs-site.xml8.4 mapred-site.xml8.5 yarn-site.xml8.6 …

ReactNative入门

React基本用法&#xff1a; react与js不同的点在于 react使用的是虚拟DOM js是真实DOM 作用&#xff1a;当有新的数据填充 可以复用之前的&#xff0c;而js需要整体重新渲染 创建虚拟DOM还可以使用jsx语法直接声明&#xff1a; 注意要用babel标签将jsx转化为js 但是建议采用j…

UNIX环境高级编程——进程环境

7.1 引言 本章主要讲解了进程的环境。 7.2 main函数 C程序总是从main函数开始执行&#xff0c;其函数原型为&#xff1a; int main(int argc, char *argv[]);argc是命令行参数的数目&#xff0c;argv是指向参数的各个指针所构成的数组&#xff1b;当内核执行C程序时&#x…

SpringBoot集成Kafka详解

一、使用idea创建SpringBoot项目 1.1 使用Spring Initializr创建一个SpringBoot程序 点击Next。 1.2 添加依赖 依赖说明&#xff1a; Lombok简化实体类开发。 Spring Web让项目集成web开发所有依赖&#xff0c;包括Spring MVC&#xff0c;内置tomcat等。 Spring for Apache…

HNU-操作系统OS-2023期中考试复习-刷题

往年期中卷极难获得&#xff0c;这里找了几套卷子。可以看看。 因为往年都是从第一周开始上课的&#xff0c;所以进度会快一点&#xff0c;这学期是从第四周开始上课的&#xff0c;所以进程会慢些&#xff0c;讲到第九章所以只考到第九章。 同样因为太忙了&#xff0c;答案找…

图像分类卷积神经网络模型综述

图像分类卷积神经网络模型综述遇到问题 图像分类&#xff1a;核心任务是从给定的分类集合中给图像分配一个标签任务。 输入&#xff1a;图片 输出&#xff1a;类别。 数据集MNIST数据集 MNIST数据集是用来识别手写数字&#xff0c;由0~9共10类别组成。 从MNIST数据集的SD-1和…

ctfshow web入门web119-124

1.web119 和118题类似&#xff0c;只不过是过滤了PATH 0可以用任何字符代替&#xff0c;比如A,{A},A,{0} KaTeX parse error: Expected }, got # at position 2: {#̲SHLVL}1&#xff0c;或者{##},${#?} {PHP_VERSION:~A}2,php版本为x.x.2时 ${#IFS}3(linux下是3&#xff0c;…

IntelliJ IDEA 2023.1正式发布,Maven项目大提速支持Apache Dubbo

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 一年一个大版本&#xff0c;共计3个中型版本&#xff0c;北京时间2023年3月月29日终于迎来了IntelliJ IDEA今年的首个版本2023.1。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这…

顺丰科技x腾讯安全iOA联合案例获云安全联盟CSA 2022安全革新奖

近年来&#xff0c;随着云计算、大数据、物联网等技术的加速创新和应用&#xff0c;一场数字化的变革开始席卷各行各业。远程办公、业务协同、分支互联等需求涌现&#xff0c;随之而来的还有更加复杂多元的高级网络攻击。在此背景下&#xff0c;传统的基于边界的网络安全防护理…