从头开始学Spring—02基于XML管理bean

news2024/11/17 21:51:07

目录

1.实验一:入门案例

2.实验二:获取bean

3.实验三:依赖注入之setter注入

4.实验四:依赖注入之构造器注入

5.实验五:特殊值处理

6.实验六:为类类型属性赋值

7.实验七:为数组类型属性赋值

8.实验八:为集合类型属性赋值

9.实验九:p命名空间

10.实验十:引入外部属性文件(以jdbc为例)

11.实验十一:bean的作用域

12.实验十二:bean的生命周期

13.实验十三:FactoryBean

14.实验十四:基于xml的自动装配


1.实验一:入门案例

①创建Maven Module

②引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

③创建类

public class HeloWorld {
    public void sayHello(){
        System.out.println("test spring~~~");
    }
}

④创建Spring的配置文件

⑤在Spring的配置文件中配置bean

<!--
    配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理
    通过bean标签配置IOC容器所管理的bean
    属性:
    id:设置bean的唯一标识
    class:设置bean所对应类型的全类名
-->
<bean id="helloworld" class="com.ykx.spring.pojo.HelloWorld"></bean>

⑥创建测试类对象

@Test
public void test(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
    HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloworld");
    helloWorld.sayHello();
}

⑦思路

⑧注意

2.实验二:获取bean

①方式一:根据id获取

@Test
public void test(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student studentOne = (Student) ioc.getBean("studentOne");
    System.out.println(studentOne);
}

②方式二:根据类型获取

@Test
public void test2(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student student = ioc.getBean(Student.class);
    System.out.println(student);
}

③方式三:根据id和类型

@Test
public void test3(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student student = ioc.getBean("studentOne",Student.class);
    System.out.println(student);
}

④注意

⑤扩展

⑥结论

3.实验三:依赖注入之setter注入

①创建Student类

public class Student {

    private Integer sid;
    private String sname;
    private Integer age;
    private String gender;

    public Student() {
    }

    public Student(Integer sid, String sname, Integer age, String gender) {
        this.sid = sid;
        this.sname = sname;
        this.age = age;
        this.gender = gender;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

②配置bean时为属性赋值

<bean id="studentTwo" class="com.ykx.spring.pojo.Student">
    <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
    <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
    -->
    <!-- value属性:指定属性值 -->
    <property name="sid" value="1001"></property>
    <property name="sname" value="张三"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property>
</bean>

 ③测试

@Test
public void test(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student student = ioc.getBean("studentTwo",Student.class);
    System.out.println(student);
}

4.实验四:依赖注入之构造器注入

①在Student类中添加有参构造

public Student() {
}

public Student(Integer sid, String sname, Integer age, String gender) {
    this.sid = sid;
    this.sname = sname;
    this.age = age;
    this.gender = gender;
}

②配置bean

<bean id="studentThree" class="com.ykx.spring.pojo.Student">
    <constructor-arg value="1002"></constructor-arg>
    <constructor-arg value="李四"></constructor-arg>
    <constructor-arg value="33"></constructor-arg>
    <constructor-arg value="女"></constructor-arg>
</bean>

③测试

@Test
public void test5(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student student = ioc.getBean("studentThree",Student.class);
    System.out.println(student);
}

5.实验五:特殊值处理

①字面量赋值

②null值

③xml实体

④CDATA节

6.实验六:为类类型属性赋值

①创建班级类Clazz

public class Clazz {

    private Integer clazzId;
    private String clazzName;

    public Clazz() {
    }

    public Clazz(Integer clazzId, String clazzName) {
        this.clazzId = clazzId;
        this.clazzName = clazzName;
    }

    public Integer getClazzId() {
        return clazzId;
    }
    public void setClazzId(Integer clazzId) {
        this.clazzId = clazzId;
    }
    public String getClazzName() {
        return clazzName;
    }
    public void setClazzName(String clazzName) {
        this.clazzName = clazzName;
    }
    @Override
    public String toString() {
        return "Clazz{" +
                "clazzId=" + clazzId +
                ", clazzName='" + clazzName + '\'' +
                '}';
    }

}

②修改Student类

③方式一:引用外部已声明的bean

<bean id="clazzOne" class="com.ykx.spring.pojo.Clazz">
    <property name="clazzId" value="1111"></property>
    <property name="clazzName" value="财源滚滚班"></property>
</bean>

<bean id="studentFive" class="com.ykx.spring.pojo.Student">
    <property name="sid" value="1004"></property>
    <property name="sname" value="赵六"></property>
    <property name="age" value="26"></property>
    <property name="gender" value="女"></property>
    <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
    <property name="clazz" ref="clazzOne"></property>
</bean>

测试

@Test
public void test6(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Student student = ioc.getBean("studentFive",Student.class);
    System.out.println(student);
}

④方式二:内部bean

<bean id="studentSix" class="com.ykx.spring.pojo.Student">
    <property name="sid" value="1004"></property>
    <property name="sname" value="赵六"></property>
    <property name="age" value="26"></property>
    <property name="gender" value="女"></property>
    <property name="clazz">
        <!-- 在一个bean中再声明一个bean就是内部bean -->
        <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
        <bean id="clazzInner" class="com.ykx.spring.pojo.Clazz">
            <property name="clazzId" value="2222"></property>
            <property name="clazzName" value="远大前程班"></property>
        </bean>
    </property>
</bean>

⑤方式三:级联属性赋值

<bean id="studentSeven" class="com.ykx.spring.pojo.Student">
    <property name="sid" value="1004"></property>
    <property name="sname" value="赵六"></property>
    <property name="age" value="26"></property>
    <property name="gender" value="女"></property>
    <!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="clazz.clazzId" value="3333"></property>
    <property name="clazz.clazzName" value="最强王者班"></property>
</bean>

7.实验七:为数组类型属性赋值

①修改Student类

在Student类中添加以下代码:

private String[] hobbies;

public String[] getHobbies() {
    return hobbies;
}

public void setHobbies(String[] hobbies) {
    this.hobbies = hobbies;
}

②配置bean

<bean id="studentFour" class="com.ykx.spring.pojo.Student">
    <property name="sid" value="1004"></property>
    <property name="sname" value="赵六"></property>
    <property name="age" value="26"></property>
    <property name="gender" value="女"></property>
    <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="hobbies">
        <array>
            <value>lol</value>
            <value>cf</value>
            <value>云顶之弈</value>
            <value>金铲铲之战</value>
        </array>
    </property>
</bean>

8.实验八:为集合类型属性赋值

①为List集合类型属性赋值

在Clazz类中添加以下代码:

private List<Student> students;

public List<Student> getStudents() {
    return students;
}

public void setStudents(List<Student> students) {
    this.students = students;
}

配置bean:.

<bean id="clazzTwo" class="com.ykx.spring.pojo.Clazz">
    <property name="clazzId" value="4444"></property>
    <property name="clazzName" value="Javaee0222"></property>
    <property name="students">
        <list>
            <ref bean="studentOne"></ref>
            <ref bean="studentTwo"></ref>
        </list>
    </property>
</bean>

测试结果:

@Test
public void test7(){
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取Bean
    Clazz clazz = ioc.getBean("clazzTwo", Clazz.class);
    System.out.println(clazz);
}

②为Map集合类型属性赋值

创建教师类

public class Teacher {

    private Integer teacherId;
    private String teacherName;

    public Teacher() {
    }

    public Teacher(Integer teacherId, String teacherName) {
        this.teacherId = teacherId;
        this.teacherName = teacherName;
    }

    public Integer getTeacherId() {
        return teacherId;
    }

    public void setTeacherId(Integer teacherId) {
        this.teacherId = teacherId;
    }

    public String getTeacherName() {
        return teacherName;
    }

    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "teacherId=" + teacherId +
                ", teacherName='" + teacherName + '\'' +
                '}';
    }
}

在Student类中添加以下代码:

private Map<String, Teacher> teacherMap;

public Map<String, Teacher> getTeacherMap() {
    return teacherMap;
}

public void setTeacherMap(Map<String, Teacher> teacherMap) {
    this.teacherMap = teacherMap;
}

配置bean:

<bean id="teacherOne" class="com.ykx.spring.pojo.Teacher">
    <property name="teacherId" value="10010"></property>
    <property name="teacherName" value="大宝"></property>
</bean>
<bean id="teacherTwo" class="com.ykx.spring.pojo.Teacher">
    <property name="teacherId" value="10086"></property>
    <property name="teacherName" value="二宝"></property>
</bean>
<bean id="studentEight" class="com.ykx.spring.pojo.Student">
<property name="sid" value="1004"></property>
<property name="sname" value="赵六"></property>
<property name="age" value="26"></property>
<property name="gender" value="女"></property>
<!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
<property name="clazz" ref="clazzOne"></property>
<property name="hobbies">
    <array>
        <value>lol</value>
        <value>cf</value>
        <value>云顶之弈</value>
    </array>
</property>
<property name="teacherMap">
<map>
<entry>
<key>
    <value>10010</value>
</key>
    <ref bean="teacherOne"></ref>
</entry>
    <entry>
        <key>
            <value>10086</value>
        </key>
        <ref bean="teacherTwo"></ref>
    </entry>
</map>
</property>
</bean>

③引用集合类型的bean

使用util:list、util:map标签必须引入相应的命名空间,可以通过idea的提示功能选择

<!--list集合类型的bean-->
<util:list id="students">
    <ref bean="studentOne"></ref>
    <ref bean="studentTwo"></ref>
    <ref bean="studentThree"></ref>
</util:list>
<!--map集合类型的bean-->
<util:map id="teacherMap">
    <entry>
        <key>
            <value>10010</value>
        </key>
        <ref bean="teacherOne"></ref>
    </entry>
    <entry>
        <key>
            <value>10086</value>
        </key>
        <ref bean="teacherTwo"></ref>
    </entry>
</util:map>

<bean id="clazzTwo" class="com.atguigu.spring.bean.Clazz">
    <property name="clazzId" value="4444"></property>
    <property name="clazzName" value="Javaee0222"></property>
    <property name="students" ref="students"></property>
</bean>

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
<property name="id" value="1004"></property>
<property name="name" value="赵六"></property>
<property name="age" value="26"></property>
<property name="sex" value="女"></property>
<!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
<property name="clazz" ref="clazzOne"></property>
<property name="hobbies">
    <array>
        <value>抽烟</value>
        <value>喝酒</value>
        <value>烫头</value>
    </array>
</property>
<property name="teacherMap" ref="teacherMap"></property>
</bean>

9.实验九:p命名空间

10.实验十:引入外部属性文件(以jdbc为例)

①加入依赖

<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>
<!-- 数据源 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.31</version>
</dependency>

②创建外部属性文件

jdbc.user=root
jdbc.password=ykxykx
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver

③引入属性文件

④配置bean

<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="${jdbc.url}"/>
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

⑤测试

@Test
public void test() throws Exception {
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-datasource.xml");
    //获取Bean
    DruidDataSource ds = ioc.getBean(DruidDataSource.class);
    Connection connection = ds.getConnection();
    System.out.println(connection);
}

11.实验十一:bean的作用域

12.实验十二:bean的生命周期

①具体的生命周期过程

②bean的后置处理器

13.实验十三:FactoryBean

①简介

②创建类UserFactoryBean

public class UserFactoryBean implements FactoryBean<User> {

    @Override
    public User getObject() throws Exception {
        return new User();
    }
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }

}

③配置bean

<bean id="user" class="com.ykx.spring.factory.UserFactoryBean"></bean>

④测试

@Test
public void testUserFactoryBean(){
    //获取IOC容器
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring-factory.xml");
    User user = (User) ac.getBean("user");
    System.out.println(user);
}

14.实验十四:基于xml的自动装配

①场景模拟

②配置bean

byType

<bean id="userController"
      class="com.ykx.spring.controller.UserController" autowire="byType">
</bean>
<bean id="userService"
      class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byType">
</bean>
<bean id="userDao" class="com.ykx.spring.dao.impl.UserDaoImpl"></bean>

byName

<bean id="userController"
      class="com.ykx.spring.controller.UserController" autowire="byName">
</bean>
<bean id="userService"
      class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byName">
</bean>
<bean id="userServiceImpl"
      class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byName">
</bean>
<bean id="userDao" class="com.ykx.spring.dao.impl.UserDaoImpl"></bean>
<bean id="userDaoImpl" class="com.ykx.spring.dao.impl.UserDaoImpl">
</bean>

③测试

@Test
public void test(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire.xml");
    UserController userController = ioc.getBean(UserController.class);
    userController.saveUser();

}

 

内容来源于黑马程序员SSM课程的笔记,仅作为学习笔记参考

 

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

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

相关文章

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…

国产分布式数据库高可用故障检测实现

在分布式数据库架构下&#xff0c;当数据库节点异常时&#xff0c;数据库管理组件能够自动感知到异常并触发节点隔离或者自动切换&#xff0c;是数据库高可用容灾的基本能力。在节点服务器异常、网络异常或进程异常等场景下&#xff0c;各数据库产品本身已经具备了可靠的检测能…

C#之如何判断数据类型

一、GetType方法 a.GetType()&#xff1a;获取当前变量的类型对象 string str "Hello World";Console.WriteLine(str.GetType()); 结果: 二、typeof方法 typeof(Int)&#xff1a;获取的是Int类型的类型对象 int num 10;Console.WriteLine(num.GetType() typeof(i…

NSSCTF中的1zjs、作业管理系统、finalrce、websign、简单包含、Http pro max plus

目录 [LitCTF 2023]1zjs [LitCTF 2023]作业管理系统 [SWPUCTF 2021 新生赛]finalrce exec()函数&#xff1a;php中exec介绍及使用_php exec-CSDN博客​​​​​​ 资料参考&#xff1a;RCE(远程命令执行)绕过总结_rce绕过-CSDN博客 [UUCTF 2022 新生赛]websign [鹏城杯 …

Python实现麦克风录音保存到wav

功能展示&#xff1a; 运行环境&#xff1a; Python: 3.10.4 64-bit 操作系统&#xff1a; 截图环境&#xff1a;win10 64-bit 视频录屏环境&#xff1a;win10 64-bit 功能说明&#xff1a; 点击界面开始按钮开始录音&#xff0c;点击停止按钮结束录音。 源码文件列表&…

Linux的命名管道 共享内存

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 命名管道 基本概念&#xff1…

OpenAI GPT-4

本文翻译整理自&#xff1a;https://openai.com/index/gpt-4-research/ (March 14, 2023) 文章目录 一、关于 GPT-4二、能力视觉输入Visual inputs: chart reasoningSample 2 of 7 操纵性Steerability: Socratic tutorSample 1 of 3 三、局限性四、风险与缓解措施五、训练流程…

鱼哥好书分享活动第22期:《数字政府网络安全合规性建设指南》解锁数字政府网络安全新篇章

鱼哥好书分享活动第22期&#xff1a;《《数字政府网络安全合规性建设指南》》解锁数字政府网络安全新篇章 阅读对象&#xff1a;书籍目录&#xff1a;了解更多&#xff1a;赠书抽奖规则: 当今时代&#xff0c;数据已成为新型生产要素&#xff0c;不仅是个人、企业乃至国家的重要…

enable_shared_from_this使用笔记

解决了&#xff1a; 不能通过原指针增加引用次数的问题 &#xff0c;通过weak_ptr实现。 class MyCar:public std::enable_shared_from_this<MyCar> { public:~MyCar() { std::cout << "free ~Mycar()" << std::endl; } };int main() { MyCar* _…

算法-卡尔曼滤波之基本数学的概念

1.均值 定义&#xff1a;均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量&#xff0c;通常用符号 xˉ 表示。 &#xff1a;对于包含 n 个数据的数据集 {&#x1d465;1,&#x1d465;2,...,&#x1d465;&#x1d45b;}&#xff0c;均值 xˉ 计…

高扩展性便携式1553B总线测试仪,支持麒麟操作系统

手提式便携1553B总线测试仪&#xff0c;利用订制平台的PXIe扩展槽嵌入石竹科技自主研发的高性能T系列专用1553B测试板卡和高级协议分析和测试软件FP-1553B Pro、FP-5186集成的一款模块化、功能可订制的测试仪器。 基本配置可对1553B信号进行波形采集&#xff08;提供软件示波器…

goconvey测试框架的使用

尽管Golang已经内置了功能强大的testing包&#xff0c;其易用性令人称赞。然而&#xff0c;当我们希望更直观地处理和判断测试结果时&#xff0c;结合使用goconvey能为我们提供极大的便利。goconvey不仅为我们提供了丰富的断言函数&#xff0c;这些函数还极大地方便了我们在进行…

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…

本地安装nvm,管理多版本node

先卸载本地的nodejs(14.16.1) 卸载的直接可以点击win10图标→设置→应用→应用和功能 卸载nodejs即可 2. 安装nvm&#xff0c;地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 安装目录时尽量不要出现特殊字符还有空格&#xff0c;否则会在nvm use xxx的…

海外媒体发稿:如何在日本媒体投放新闻通稿-大舍传媒

导言 在全球化的时代背景下&#xff0c;海外媒体宣发对于企业来说非常重要。通过在海外媒体投放新闻通稿&#xff0c;企业能够拓展海外市场&#xff0c;增强知名度和影响力。本文将探讨如何在海外媒体投放新闻通稿&#xff0c;以帮助企业进行有效的海外宣传。 挖掘海外媒体资…

Alibaba SpringCloud集成Nacos、Sentinel实现服务治理-17

关于服务治理 总体而言&#xff0c;限流和降级作为微服务架构中的重要机制&#xff0c;尽管在实现上可能有多种方式&#xff0c;但它们都着眼于保护服务提供者和消费者&#xff0c;在面对异常情况时确保系统稳定运行。限流关注于保护服务提供者&#xff0c;控制请求流量&#…

20232810 2023-2024-2 《网络攻防实践》实验九

一、实践内容 1.1 反汇编 1.1.1 编程原理 编程的原理是一套指导软件开发和维护的概念、原则和实践&#xff0c;包括抽象以简化复杂系统、模块化以分解程序、封装以隐藏内部状态、继承以共享特性、多态以允许不同响应、算法和数据结构以组织计算和存储、控制结构以控制流程、…

UVa11419 SAM I AM

UVa11419 SAM I AM 题目链接题意分析AC 代码 题目链接 UVA - 11419 SAM I AM 题意 给出一个 RC 大小的网格&#xff0c;网格上面放了一些目标。可以在网格外发射子弹&#xff0c;子弹会沿着垂直或者水平方向飞行&#xff0c;并且打掉飞行路径上的所有目标&#xff0c;如下图所…

System V IPC(进程间通信)机制详解

文章目录 一、引言二、System V IPC的基本概念1、IPC结构的引入2、IPC标识符&#xff08;IPC ID&#xff09;3、S ystem V的优缺点 三、共享内存&#xff08;Shared Memory&#xff09;1、共享内存的基本概念2、共享内存的创建&#xff08;shmget&#xff09;3、共享内存的附加…

深入探索Android签名机制:从v1到v3的演进之旅

引言 在Android开发的世界中&#xff0c;APK的签名机制是确保应用安全性的关键环节。随着技术的不断进步&#xff0c;Android签名机制也经历了从v1到v3的演进。本文将带你深入了解Android签名机制的演变过程&#xff0c;揭示每个版本背后的技术细节&#xff0c;并探讨它们对开…