Spring5学习笔记

Spring5

  • 框架概述
  • IOC(Inversion Of Control)
    • IOC基本过程:
    • IOC接口(BeanFactory)
      • IOC接口实现类
    • IOC操作Bean管理
      • 一、什么是Bean管理?
      • 二、什么是DI?
      • 三、Bean管理的两种实现方式
        • 1.基于XML配置文件方式实现
          • 基于XML方式创建对象
          • 基于XML方式注入属性
            • 常规属性注入
            • 特殊属性值的注入
        • 2.基于注解方式实现
          • 什么是注解?
          • 基于注解方式创建对象
            • 有关创建对象提供的注解(默认都是单例)
          • 基于注解方式注入属性
            • 有关 对象属性注入 的注解
            • 示例
          • 实现完全注解开发(无XML配置文件)
      • 四、Bean管理的作用域
        • 如何设置Spring创建Bean是单实例还是多实例?
        • 区别
      • 五、Bean管理的生命周期
        • Spring中Bean生命周期的基本流程(未添加后置处理器)
          • 演示
        • Spring中Bean生命周期的基本流程(添加后置处理器)
          • 演示
      • 六、Bean管理之XML自动装配
      • 七、Bean管理之引入外部属性文件
  • AOP(Aspect Oriented Programming)
    • 概念
    • AOP术语
      • 连接点
      • 切入点
      • 通知(增强)
        • 切面
    • AOP底层原理
      • 动态代理
        • 有接口(JDK动态代理)
          • 演示实现过程
        • 无接口(CGLIB动态代理)
    • AOP操作
      • 基于AspectJ实现AOP操作
        • 通过XML配置文件方式实现
          • 基本步骤
        • 通过AspectJ注解方式实现
          • 基本步骤
          • 示例
          • 常用操作
  • JDBCTemplate
    • JDBCTemplate基本使用流程
    • JDBCTemplate基本CRUD操作
      • CREATE 增
      • READ 查
      • UPDATE 改
      • DELETE 删
  • Spring 事务操作
    • 事务概念
      • 事务使用基本流程
    • Spring 事务管理
      • Spring 事务管理 API
      • 编程式事务管理
      • 声明式事务管理(常用)
        • 参数配置
        • 基于注解方式(常用)
        • 基于 xml 配置文件方式
        • 示例:完全注解实现Spring声明式事务管理
  • Spring 配置文件常见XML标签
    • Bean标签
      • Property标签
        • Value标签
        • list标签
          • Value标签
          • ref标签
        • Array标签
          • Value标签
        • Map标签
          • Entry标签
        • Set标签
          • Value标签
  • Spring5 新功能
    • Spring5 框架整合 Log4j2
    • Spring5 框架整合 JUnit4
    • Spring5 框架整合 JUnit5

Spring5代码学习仓库:Gitee
视频课程:尚硅谷2022 Spring5教程
Spring5新特性
https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md
https://zhuanlan.zhihu.com/p/645200006

框架概述

Spring 是轻量级的开源的 JavaEE 框架。Spring 可以解决企业应用开发的复杂性。
Spring 有两个核心部分:IOC 和 Aop
(1)IOC:控制反转,把创建对象过程交给 Spring 进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
Spring 特点
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度

IOC(Inversion Of Control)

把对象创建和对象之间的调用过程,交给 Spring 进行管理。

目的:为了降低开发中的耦合度。
基本实现原理:XML解析、工厂模式、反射。

附:工厂模式详解

IOC基本过程:

  1. xml配置文件,配置要创建的对象Bean。
  2. xml解析得到配置文件中的包路径。
  3. 创建XXFactory工厂类,通过反射创建对象返回。

IOC接口(BeanFactory)

IOC的思想就是基于IOC容器完成,IOC的底层就是对象工厂。
Spring提供了两个IOC容器实现的方式(两个接口)。

  • BeanFactory:IOC容器的基本实现,一般是Spring内部使用,不建议开发人员使用。
    • 在加载配置文件时不会创建容器中的对象,只有获取时才创建
  • ApplicationContext:BeanFactory的子接口,提供更多更强大的功能。一般由开发人员使用。
    • 在加载配置文件时会同时创建容器中的对象

注:推荐使用ApplicationContext接口,因为项目使用中,一般把耗时的操作放在项目启动时。

IOC接口实现类

在这里插入图片描述

IOC操作Bean管理

Spring中有两种类型的Bean:普通Bean(开发者自己创建)工厂Bean(FactoryBean)
主要区别

  • 普通Bean:在配置文件中定义的Bean类型(class中指定)就是获取bean得到的类型。
  • 工厂Bean:在配置文件中定义的Bean类型(class中指定)可以和获取bean类型不一致。

怎么手动创建工厂Bean?

  1. 创建类,实现FactoryBean接口
  2. 实现接口中的方法,在实现的getObject方法中可以定义不同的返回Bean类型
public class MyBean implements FactoryBean<Department> {
   
    @Override
    public Department getObject() throws Exception {
   
        // 自定义返回类型
        Department department = new Department();
        department.setDeptName("研发部");
        return department;
    }

    @Override
    public Class<?> getObjectType() {
   
        return null;
    }

    @Override
    public boolean isSingleton() {
   
        return FactoryBean.super.isSingleton();
    }
}

一、什么是Bean管理?

Bean管理指两个操作:

  • 由Spring创建对象
  • 由Spring注入属性。

二、什么是DI?

DI(Dependency Injection)依赖注入,IOC的具体实现,简单来说就是注入属性,需要在创建对象完成的基础之前来进行

三、Bean管理的两种实现方式

1.基于XML配置文件方式实现
基于XML方式创建对象

在配置文件的beans标间中新建bean标签,填写id、class等属性。
:如果没有设置构造参数子标签(<constructor-arg></constructor-arg>),则默认使用无参构造方法创建,因此需要注意无参构造是否存在。

基于XML方式注入属性
常规属性注入
  • 使用set方法注入(默认使用无参构造创建bean
    1. 在实体类中创建好对应属性的set方法
    2. 在Spring配置文件中的Bean标签中插入属性标签<property name="property" value="value"></property>
  • 使用有参构造方法注入(根据参数匹配构造方法创建bean
    1. 在实体类中创建好对应属性的 有参构造方法
    2. 在Spring配置文件中的Bean标签中插入构造方法参数标签<constructor-arg name="property" value="value"></constructor-arg><constructor-arg index=“Number” value="value"></constructor-arg>
      • name:构造方法中参数的属性名
      • value:注入的实际值
      • index: 索引,从0开始,代表构造方法从左至右的参数。
      • 注:相较于标签的两种写法,使用name方式更准确。
  • P名称空间注入(用于简化XML配置方式)
    1. 在XML配置文件中的beans标签上添加xmlns:p="http://www.springframework.org/schema/p"命名空间
    2. 进行属性注入,在bean标签中操作。
      • 无需再写子标签,直接在bean书写p:注入属性名即可完成操作。
      • 注意 : 仅简化set方式注入

XML配置文件示例

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置User对象创建:默认使用无参构造方法 -->
    <bean id="my_user" class="icu.lking.spring5.User"></bean>

    <!-- 方式一:使用set方法完成依赖注入 -->
    <!-- 配置Book对象创建信息:默认使用无参构造方法 -->
    <bean id="book_di_property" class="icu.lking.spring5.Book">
        <property name="bookName" value="小红与小牛的故事"></property>
        <property name="author" value="Jason"></property>
    </bean>

    <!-- 方式二:使用构造方法方法完成依赖注入 -->
    <!-- 配置Book对象创建信息:这里使用有参构造方法 -->
    <bean id="book_di_constructor_name" class="icu.lking.spring5.Book">
        <!-- 使用name方式 -->
        <constructor-arg name="author" value="Jason"></constructor-arg>
        <constructor-arg name="bookName" value="放牛娃的夏天"></constructor-arg>
    </bean>
    <bean id="book_di_constructor_index" class="icu.lking.spring5.Book">
        <!-- 使用Index方式 -->
        <constructor-arg index="0" value="小白和小黑"></constructor-arg>
        <constructor-arg index="1" value="Jason"></constructor-arg>
    </bean>

    <!-- 方式三:使用p命名空间注入属性  注意 : 仅简化set方式注入 -->
    <bean id="order_di_p_label" class="icu.lking.spring5.Order" p:orderNumber="123456" p:createUserName="Jason"></bean>
</beans>
特殊属性值的注入

字面量:设置的固定值都是字面量。

  1. null值
    主要是null标签的使用。
<!-- 注入特殊值,null值 -->
    <bean id="student_di_null" class="icu.lking.spring5.Student">
        <property name="name" value="Jason"></property>
        <property name="stuNumber">
            <!-- null值标签 -->
            <null/>
        </property>
    </bean>
  1. 属性值包含特殊符号
    主要问题:使用特殊符号中要避免xml进行转义。
    解决方式
    ①.特殊符号使用转义字符,如>&gt;表示
    ②.使用<![CDATA[...]]>标记,可以忽略xml的转义(在该标签中的语句和字符原本是什么样的,在拼接成SQL后还是什么样的)
 <!-- 注入特殊值,包含特殊符号的属性值 -->
    <!-- 主要是要避免xml进行转义 -->
    <!-- 1.特殊符号使用转义字符,如>用&gt;表示 -->
    <!-- 2.使用<![CDATA[...]]>标记,可以忽略xml的转义(在该标签中的语句和字符原本是什么样的,在拼接成SQL后还是什么样的) -->
    <bean id="student_di_split_label" class="icu.lking.spring5.Student">
        <!-- 拆分属性标签写法 -->
        <property name="name">
            <value>Jason&lt;CEO&gt;</value>
        </property>
        <property name="stuNumber">
            <value><![CDATA[<<20210907>>]]></value>
        </property>
    </bean>
  1. 注入外部Bean属性
    使用property标签的ref属性来注入外部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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 外部Bean注入 -->
    <!-- UserService Bean,采用Set注入方式注入UserDao -->
    <bean id="userService" class="icu.lking.spring5.service.UserService">
        <!-- Set注入  ref:填写外部Bean ID-->
        <property name="userDao" ref="userDao"></property>
    </bean>
    <!-- UserDao Bean :寻找其实现类创建Bean-->
    <bean id="userDao" class="icu.lking.spring5.dao.impl.UserDaoImpl"></bean>

    <!-- 测试User -->
    <bean id="testUser" class="icu.lking.spring5.User" p:name="Jason" p:sex="male"></bean>
</beans>
  1. 注入内部Bean属性和级联赋值
    • 注入内部Bean
      注入内部Bean,即在Property标签下嵌套Bean标签实现。
    • 级联赋值
      级联赋值即 在不嵌套bean标签的情况下,便可完成对内部bean的内部属性赋值。
      实现方式
      采用外部bean的方式注入,即可不嵌套bean标签。采用.符号则可可同时对外部bean的属性赋值,无需嵌套bean标签。(需要有get方法
<?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 -->
    <bean id="testEmp" class="icu.lking.spring5.bean.Employee">
        <!-- set注入 普通属性 : 两种写法,效果相同 -->
        <property name="name" value="Jason"></property>
        <property name="workNumber">
            <value>20210907</value>
        </property>
        <!-- 注入属性 内部Bean -->
        <property name="department">
            <!-- 内部Bean 可以不写 id -->
            <bean id="inner_bean_dept" class="icu.lking.spring5.bean.Department">
                <property  name="deptName" value="研发部"></property>
            </bean>
        </property>
    </bean>

    <bean id="testEmpAgain" class="icu.lking.spring5.bean.Employee">
        <!-- set注入 普通属性 -->
        <property name="name" value="Jack"></property>
        <property name="workNumber" value="20210906"></property>
        <!-- 注入属性 内部Bean -->
        <!-- 级联赋值: 可以通过外部bean 方式 并搭配 级联符号 -->
        <property name="department" ref="dept"></property>
        <!-- 如果使用级联符号 必须 注意:需要在Employee类中提供该属性的get方法,才能使用 -->
        <property name="department.deptName" value="安保部"></property>
    </bean>
    <bean id="dept" class="icu.lking.spring5.bean.Department"></bean>
</beans>
  1. 注入数组/List集合/Map集合/Set集合类型属性值
    • 在使用基本数据类型与包装类和String类型作为元素情况下
      property下写出对应属性的标签即可。
    • 在使用对象作为元素的情况下
      提前创建对应数目的元素bean,在property下写出对应属性的标签,并在对应标签下添加对应元素bean数目的ref标签,在ref标签的bean属性中填写 元素bean的id。
    • 数组/List集合/Map集合/Set集合类型属性值的 提取 (重复使用)
      1. 添加util命名空间
        • xmlns:util="http://www.springframework.org/schema/util"
        • 同时在xsi:schemaLocation="...”中追加http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
      2. 创建公共引用部分集合,定义id
      3. 注入属性时,使用property标签的ref属性引用公共集合部分
package icu.lking.spring5.collectiontype;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 测试 注入
 */
public class CollectionTestBean {
   
    // -------在使用基本数据类型与包装类和String类型作为 元素 情况下--------
    // 1. 数组类型属性
    private String[] arr;
    // 2. List集合类型属性
    private List<String> list;
    // 3. Map集合类型属性
    private Map<String, String> map;
    // 4. Set集合类型属性
    private Set<String> set;
    // ----公共集合共用----
    private List<String> list1;
    private List<String> list2;
    // -----在使用对象作为 元素 的情况下------
    private List<Course> courseList;

    public void setCourseList(List<Course> courseList) {
   
        this.courseList = courseList;
    }

    public void setArr(String[] arr) {
   
        this.arr = arr;
    }

    public void setList1(List<String> list1) {
   
        this.list1 = list1;
    }

    public void setList2(List<String> list2) {
   
        this.list2 = list2;
    }

    public void setList(List<String> list) {
   
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
   
        this.map = map;
    }

    public void setSet(Set<String> set) {
   
        this.set = set;
    }

    /**
     * 重写 toString 展示数据
     * @return
     */
    @Override
    public String toString() {
   
        return "CollectionTestBean{" +
                "arr=" + Arrays.toString(arr) +
                ", list=" + list +
                ", map=" + map +
                ", set=" + set +
                ", list1=" + list1 +
                ", list2=" + list2 +
                ", courseList=" + courseList +
                '}';
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <!-- 公共部分list -->
    <util:list id="global_list">
        <value>123</value>
        <value>456</value>
        <value>789</value>
    </util:list>


    <bean id="testCollectionType" class="icu.lking.spring5.collectiontype.CollectionTestBean">
        <!-- 在使用基本数据类型与包装类和String类型作为 元素 情况下 -->
        <!-- 1. 注入 数组属性值 -->
        <property name="arr">
            <!-- 这里采用array标签或list标签都可 -->
            <array>
                <value></value>
                <value></value>
                <value></value>
            </array>
        </property>
        <!-- 2. 注入 List集合属性值 -->
        <property name="list">
            <list>
                <value></value>
                <value></value>
                

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

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

相关文章

文本检索性能提升 40 倍,Apache Doris 倒排索引深度解读

在 OLAP 领域&#xff0c;Apache Doris 已成为高性能、高并发以及高时效性的代名词。在面向海量数据的复杂查询需求时&#xff0c;除硬件配置、集群规模、网络带宽等因素外&#xff0c;提升性能的核心在于如何最大程度地降低 SQL 执行时的 CPU、内存和 IO 开销&#xff0c;而这…

记 Rxjava zip操作符遇到的问题

在项目中遇到了类似下面这样的代码 本意是希望当zip操作符中三个Observable执行完毕之后&#xff0c;将他们返回的数据统一进行处理 Observable.zip(startFirst(), startSecond(), startThird(),(first, second, third) -> {Log.i("Rxjava", "handle all dat…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

H.264与H.265的主要差异

H.265仍然采用混合编解码&#xff0c;编解码结构域H.264基本一致&#xff0c; H.265与H.264的主要不同 编码块划分结构&#xff1a;采用CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit)的递归结构。 并行工具&#xff1a;增加了Tile以及WPP等并行工具集以提高编码速…

【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)

目录 一、二叉树剩余函数1.1二叉树的层序遍历1.2判断二叉树是否为完全二叉树1.3二叉树销毁 二、二叉树的构建及遍历OJ题 一、二叉树剩余函数 1.1二叉树的层序遍历 层序遍历&#xff1a; 除了先序遍历、中序遍历、后序遍历外&#xff0c;还可以对二叉树进行层序遍历。设二叉树…

GoZero微服务个人探究之路(九)api文件编写总结

参考来源go-zero官方文档https://go-zero.dev/docs/tutorials 前言 go-zero是目前star最多的go语言微服务框架&#xff0c;api 是 go-zero特殊的语言&#xff0c;类型文件&#xff0c;go-zero自带的goctl可以通过.api文件生成http服务代码 api文件内容编写 不可使用关键字 …

webug存在的越权漏洞-水平越权以及垂直越权的漏洞复现(超详解)

越权漏洞-webug、 1.登录 账号&#xff1a;admin 密码&#xff1a;admin 2.进入逻辑漏洞 3.进入越权修改密码靶场 &#xff08;1&#xff09;输入账号密码 进入进去会发现没有权限进入 方法一&#xff1a; 这里我们只需要将 127.0.0.1:8080/control/a/auth_cross/cross_a…

小迪安全23WEB 攻防-Python 考点CTF 与 CMS-SSTI 模版注入PYC 反编译

#知识点&#xff1a; 1、PYC 文件反编译 2、Python-Web-SSTI 3、SSTI 模版注入利用分析 各语言的SSIT漏洞情况&#xff1a; SSIT漏洞过程&#xff1a; https://xz.aliyun.com/t/12181?page1&time__1311n4fxni0Qnr0%3DD%2FD0Dx2BmDkfDCDgmrYgBxYwD&alichlgrefhtt…

Angular响应式表单表单验证触发另一个字段校验

Angular响应式表单校验联动 前言表单字段日期校验函数效果 前言 在某些业务场景中&#xff0c;校验某表单字段的同时也需要校验另外一个与之相关的字段&#xff0c;例如开始时间和结束时间&#xff0c;要求结束时间必须晚于开始时间。在angular 响应式表单中改如何实现该需求呢…

云组态监控平台:开启智能监控新时代

在数字化浪潮中&#xff0c;物联网技术正逐渐成为各行业转型升级的核心驱动力。而云组态监控平台作为物联网技术的重要组成部分&#xff0c;正在开启智能监控的新时代。HiWoo Cloud的云组态监控平台&#xff0c;凭借其强大的功能和创新能力&#xff0c;致力于推动智能监控技术的…

uniapp app更新

uniapp app更新 这个版本要随之增加&#xff0c;不然刚更新时直接用app, 新包增加的那些页面跳转会有问题&#xff0c;不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…

【微信小程序】图片违法违规内容鉴别(云函数)

微信小程序通过云调用校验一张图片是否含有违法违规内容。 选择图片: wx.chooseImage({count: 6,sizeType: [compressed], // 可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album, camera], // 可以指定来源是相册还是相机&#xff0c;默认二者都有success: …

用于医学分割的实时Test-time adaption

机构&#xff1a;约翰霍普金斯 论文&#xff1a;https://arxiv.org/abs/2203.05574 代码&#xff1a;https://github.com/jeya-maria-jose/On-The-Fly-Adaptation 摘要 基于深度学习的医学成像解决方案的一个主要问题是&#xff0c;当模型在不同于其训练的数据分布上进行测…

紫光展锐T760_芯片性能介绍_展锐T760安卓核心板定制

展锐T760核心板是一款基于国产5G芯片的智能模块&#xff0c;采用紫光展锐T760制程工艺为台积电6nm工艺&#xff0c;支持工艺具有出色的能效表现。其采用主流的44架构的八核设计&#xff0c;包括4颗2.2GHz A76核心和4颗A55核心设计&#xff0c;内存单元板载可达8GB Ram256GB ROM…

HCIA——29HTTP、万维网、HTML、PPP、ICMP;万维网的工作过程;HTTP 的特点HTTP 的报文结构的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

【python爬虫】爬虫编程技术的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a; 爬虫】网络爬虫探秘⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f33c;实验目的 &#x1f…

Android开发修炼之路——(一)Android App开发基础-2

本专栏文章 上一篇 Android开发修炼之路——&#xff08;一&#xff09;Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置&#xff0c;首先描述项目和模块的区别&#xff0c;以及工程内部各目录与配置文件的用途说明&#xff1b;其次阐述两种级别…