Spring——读取和存储(包含五大注解,对象装配,注入关键字)

news2024/9/21 10:59:25

目录

一、创建Spring项目

1. 创建一个普通的maven项目

2. 添加Spring框架支持(spring-context,spring-beans)

3. 添加启动类

二、Bean对象的读取和存储——不使用注释版

1. 创建Bean

2. 将Bean注册到容器

3. 获取并使用Bean对象

3.1 创建Spring上下文

3.2 获取指定的Bean对象

getBean方法的用法

3.3 使用Bean

4. 总结步骤

三、Bean对象的读取和存储——使用注解版

1. 存储Bean对象

1.1 配置扫描路径

1.2 添加注解存储Bean对象

2. 获取Bean对象(对象装配)

2.1 属性注入

2.2 构造方法注入

2.3 Setter注入

2.4 三种注入优缺点分析

2.5 @Resource:另一种注入关键字

2.5 同⼀类型多个 Bean 报错处理

3. 总结


一、创建Spring项目

1. 创建一个普通的maven项目

2. 添加Spring框架支持(spring-context,spring-beans)

在项目的pom.xml中添加Spring框架的支持:

 <dependencies>
 <dependency>
<groupId>org.springframework</groupId>
 <artifactId>spring-context</artifactId>
 <version>5.2.3.RELEASE</version>
 </dependency>
 
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-beans</artifactId>
 <version>5.2.3.RELEASE</version>
 </dependency>
</dependencies>

3. 添加启动类

在java文件夹下创建一个启动类,包含main方法

public class App {
    public static void main(String[] args) {
      
    }
}

二、Bean对象的读取和存储——不使用注释版

1. 创建Bean

Bean就是一个普通的对象。

public class User {
    public String sayHi(String name){
        return name + "hello!";
    }
}

2. 将Bean注册到容器

添加Spring配置文件spring-config.xml(名字不能改),将文件放到resoources的根目录下。

我这里目录如下:

spring-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

将User对象注册到Spring中,在<beans>中添加如下配置:

<beans>
<bean id = "user" class="Bean.User"></bean>
</beans>

修改后的spring-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "user" class="Bean.User"></bean>
</beans>

3. 获取并使用Bean对象

有以下3步:

  • 创建Spring上下文。
  • 获取指定的Bean对象。
  • 使用Bean。

3.1 创建Spring上下文

有两种方式:

  • 使用ApplicationContext
  • 使用BeanFactory

(1). 使用ApplicationContext

// 1.得到 Spring 的上下⽂对象,创建的时候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

(2). 使用BeanFactory

BeanFactory beanFactory = new XmlBeanFactory(newClassPathResource("springconfig.xml"));

(3).  ApplicationContext和BeanFactory

        ApplicationContext和BeanFactory的效果是一样的,ApplicationContext属于BeanFactory的子类。

  • 继承关系和功能方面:Spring容器有两个顶级接口: ApplicationContext和BeanFactory。其中BeanFactory提供了基础的访问容器的能力,而ApplicationContext属于BeanFactory的子类,除了继承BeanFactory的所有功能之外,它还拥有独特的特性,添加了对国际化支持,资源访问支持,以及事件传播等方面的支持。
  • 性能方面:ApplicationContext是一次性加载并初始化所有Bean对象,而BeanFactory是需要哪个才去加载哪个,因此更加轻量。

PS:ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。

3.2 获取指定的Bean对象

// 1.得到 Spring 上下⽂对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加载某个 bean
User user = (User) context.getBean("user");

注意:Bean的Id要一一对应。

getBean方法的用法

(1). 根据类型获取Bean

UserController user = context.getBean(UserController.class);

(2). 名称+类型获取Bean

UserController user = context.getBean("user", UserController.class);

(3). 区别

 当一个类型被重复注册到spring-config.xml中时,只能使用根据名称获取。

3.3 使用Bean

public class App {
    public static void main(String[] args) {
        // 1.得到 Spring 的上下⽂对象,创建的时候需要配置 Spring 配置信息
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.加载某个bean
        User user = (User) context.getBean("user");
        // 3.调用相应方法
        System.out.println(user.sayHi("Java"));
    }
}

4. 总结步骤

1. 先得到容器。

2. 存对象

  • 创建Bean(普通类)。
  • 将Bean注册(配置)到spring-confing.xml中。

3. 取对象

  • 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
  • 获取某⼀个 Bean 对象。
  • 使⽤ Bean 对象。

三、Bean对象的读取和存储——使用注解版

1. 存储Bean对象

1.1 配置扫描路径

添加Spring配置文件spring-config.xml(名字不能改),将文件放到resoources的根目录下。

spring-config.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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="org.example"></content:component-scan>
</beans>

其中圈中的这一行为注册扫描的包,需要自己修改,我这里目录如图:

 

所以也就是说,即使添加了注解,如果不是在配置的扫描包下的类对象,也是不能被存储到Spring中的。

1.2 添加注解存储Bean对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:

  • 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  • ⽅法注解:@Bean。

1.2.1 类注解 

(1). @Controller——控制器存储,表示业务逻辑层

@Controller
public class UserController {
    public void sayHi(String name){
        System.out.println("HiController" + name);
    }
}
public class Main {
    public static void main(String[] args) {
        //1. Controller
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserController userController = (UserController) context.getBean("userController");
        // 3.调⽤ bean ⽅法
        userController.sayHi("Controller");
    }
}

(2). @Service——服务存储

@Service
public class UserService {
    public void sayHi(String name){
        System.out.println("HiService" + name);
    }
}
public class Main {
    public static void main(String[] args) {
        //2. Service
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserService userService = (UserService) context.getBean("userService");
        // 3.调⽤ bean ⽅法
        userService.sayHi("Service");

    }
}

(3). @Repository——仓库存储(数据库)

@Repository
public class UserRepository {
    public void sayHi(String name){
        System.out.println("HiRepository" + name);
    }
}
public class Main {
    public static void main(String[] args) {
        //3. Repository
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserRepository userRepository = (UserRepository) context.getBean("userRepository");
        // 3.调⽤ bean ⽅法
        userRepository.sayHi("Repository");
    }
}

(4). @Component——组件存储

@Component
public class UserComponent {
    public void sayHi(String name){
        System.out.println("HiComponent" + name);
    }
}
public class Main {
    public static void main(String[] args) {
        //4. Component
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserComponent userComponent = (UserComponent) context.getBean("userComponent");
        // 3.调⽤ bean ⽅法
        userComponent.sayHi("Component");
    }
}

(5). @Configuration——配置存储

@Configuration
public class UserConfiguration {
    public void sayHi(String name){
        System.out.println("HiConfiguration" + name);
    }
}
public class Main {
    public static void main(String[] args) {
        //5. Configuration
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserConfiguration userConfiguration = (UserConfiguration) context.getBean("userConfiguration");
        // 3.调⽤ bean ⽅法
        userConfiguration.sayHi("Configuration");
    }
}

注意:

  • 为什么需要这么多类注解?因为这样可以更方便让程序员看到注解后直接了解当前类的用途。 
  • 类注解之间的关系:@Controller、@Service、@Repository、@Configuration都是@Component的“子类”。

Bean的命名规则:

1. 类名前两个字母只有首字母大写,读取时将首字母改为小写。


 2. 类名前两个字母都是大写,读取时保持不变。

1.2.2 方法注解@Bean

类注解是添加到某个类上的,方法注解是放到某个方法上的。

 ⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中。

1.2.2.1 使用

@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.sayHi("Java");
        return user;
    }
}
public class Main2 {
    public static void main(String[] args) {
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        User user = (User) context.getBean("user1");
        // 3.调⽤ bean ⽅法
        user.sayHi("hhh");
    }
}

 

1.2.2.2 重命名Bean

@Component
public class Users {
    @Bean(name ={"u1"})
    public User user1() {
        User user = new User();
        user.sayHi("Java");
        return user;
    }
}
public class Main2 {
    public static void main(String[] args) {
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        User user = (User) context.getBean("u1");
        // 3.调⽤ bean ⽅法
        user.sayHi("hhh");
    }
}

这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字:

@Component
public class Users {
    @Bean(name = {"u1","us1"})
    public User user1() {
        User user = new User();
        user.sayHi("Java");
        return user;
    }
}

并且 name= 可以省略,如下所示:

@Component
public class Users {
    @Bean({"u1","us1"})
    public User user1() {
        User user = new User();
        user.sayHi("Java");
        return user;
    }
}

2. 获取Bean对象(对象装配)

        获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊

 对象装配(对象注⼊)的实现⽅法以下 3 种:

  • 属性注⼊
  • 构造⽅法注⼊
  • Setter 注⼊

以将Service 类注⼊到 Controller 类中举例:

2.1 属性注入

        属性注⼊是使⽤ @Autowired 实现的。

 Service类:

@Service
public class UserService {
    public void sayHi(String name){
        System.out.println("HiService" + name);
    }
}

Controller类:

@Controller
public class UserController {
    public void sayHi(String name){
        System.out.println("HiController" + name);
        userService.sayHi(name);
    }

    //属性注入
    @Autowired
    private UserService userService;
}
public class Main3 {
    public static void main(String[] args) {      
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserController userController = (UserController) context.getBean("userController");
        // 3.调⽤ bean ⽅法
        userController.sayHi("Controller");
    }
}

 输出:

2.2 构造方法注入

@Controller
public class UserController2 {
    //构造方法注入
    private UserService userService;

    @Autowired
    public UserController2(UserService userService){
        this.userService = userService;
    }

    public void sayHi(String name){
        System.out.println("HiController" + name);
        userService.sayHi(name);
    }
}
public class Main4 {
    public static void main(String[] args) {
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserController2 userController2 = (UserController2) context.getBean("userController2");
        // 3.调⽤ bean ⽅法
        userController2.sayHi("Controller2");
    }
}

注意:

如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略,但是如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指定到底使⽤哪个构造⽅法,否则程序会报错。

2.3 Setter注入

        Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注解。

@Controller
public class UserController3 {
    //Setter注入
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService){
        this.userService = userService;
    }

    public void sayHi(String name){
        System.out.println("HiController" + name);
        userService.sayHi(name);
    }
}
public class Main5 {
    public static void main(String[] args) {
        // 1.得到 spring 上下⽂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 默认类名首字母小写
        UserController3 userController3 = (UserController3) context.getBean("userController3");
        // 3.调⽤ bean ⽅法
        userController3.sayHi("Controller3");
    }
}

2.4 三种注入优缺点分析

  • 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)。
  • 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤之前⼀定能把保证注⼊的类不为空。
  • Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了。

2.5 @Resource:另一种注入关键字

@Controller
public class UserController4 {
    @Resource
    private UserService userService;
    
    public void sayHi(String name){
        System.out.println("HiController" + name);
        userService.sayHi(name);
    }
}

@Autowired 和 @Resource 的区别:

  • 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
  • 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean。
  • @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊。

2.5 同⼀类型多个 Bean 报错处理

        解决同⼀个类型,多个 bean 的解决⽅案有以下两个:

  • 使⽤ @Resource(name="user1") 定义。
  • 使⽤ @Qualifier(value = "user2")  注解定义名称。
@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.sayHi("user1");
        return user;
    }

    @Bean
    public User user2() {
        User user = new User();
        user.sayHi("user2");
        return user;
    }
}

2.5.1 使用 @Resource(name="user1") 定义

@Controller
public class UserController5 {
    @Resource(name = "user1")
    private User user;

    public void sayHi(String name){
        System.out.println("HiController" + name);
        user.sayHi(name);
    }
}

 2.5.2 使用 @Qualifier(value = "user2")  注解定义名称

@Controller
public class UserController5 {
    @Autowired
    @Qualifier("user2")
    private User user;

    public void sayHi(String name){
        System.out.println("HiController" + name);
        user.sayHi(name);
    }
}

3. 总结

将对象存储到 Spring 中:

  • 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
  • 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】

Bean 的命名规则:

        ⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。

从 Spring 中获取对象:

  • 属性注⼊
  • Setter 注⼊
  • 构造函数注⼊

注⼊的关键字有:

  • @Autowired
  • @Resource

@Autowired 和 @Resource 区别:

  • 出身不同;
  • 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。

解决同⼀类型多个 Bean 的报错:

  • 使⽤ @Resource(name="")
  • 使⽤ @Qualifier("")

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

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

相关文章

Faster RCNN系列——Anchor生成过程

一、RPN模块概述 RPN模块的输入、输出如下&#xff1a; 输入&#xff1a;feature map&#xff08;输入图像经过特征提取网络后得到的特征图&#xff09;、物体标签&#xff08;训练集中所有物体的类别和边框信息&#xff09;输出&#xff1a;Proposal&#xff08;生成的建议框…

KD-2125地下管线故障测试仪

一、产品概述 KD-2125电缆综合探测仪&#xff08;管线仪&#xff09;可进行地下电缆线路&#xff08;停电/带电&#xff09;和金属管道等敷设路径探测、识别、埋深测量&#xff1b;以及路灯电缆、地埋线路的故障查找等&#xff0c;同时也可进行地下带电线缆排查。该设备以其优越…

Android---内存性能优化

内存抖动 内存抖动是由于短时间内有大量对象进出新生区导致的&#xff0c;内存忽高忽低&#xff0c;有短时间内快速上升和下落的趋势&#xff0c;分析图呈锯齿状。 它伴随着频繁的 GC&#xff0c;GC 会大量占用 UI 线程和 CPU 资源&#xff0c;会导致 APP 整体卡顿&#xff08;…

07 dubbo源码学习_集群Cluster

1. 入口2. 源码分析2.1 FailbackClusterInvoker2.2 FailoverClusterInvoker 失败自动切换2.3 FailfastClusterInvoker 快速失败2.4 FailsafeClusterInvoker 失败安全2.4 FailsafeClusterInvoker 并行调用多个服务提供者,只要有一个返回,就立即响应3. 如何使用本篇主要介绍集群…

Python VTK STL 映射三维模型表面距离

目录 前言&#xff1a; 效果&#xff1a; 实现步骤&#xff1a; Code: 前言&#xff1a; 本文介绍了Python VTK映射三维模型表面距离&#xff0c;通过如何使用VTK计算两个三维模型(stl)的表面距离&#xff0c;并将其距离值以颜色映射到模型&#xff0c;可用于对比 两相模型…

智慧养老平台建设方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1、 总体设计 1.1 建设原则 养老机构智能化管理工程是一项涉及多学科知识的复杂的系统工程&#xff0c;养老机构智能化管理围绕机构发展战略&#xff0c;立足机构需求&…

超星项目er图,进程

一.er图 二. 进程&#xff1a;发现之前的写的分类太乱而且服务端与客户端未分离&#xff0c;于是分离客户端与服务端&#xff0c;然后将客户端的界面三个程序整理放在三个包下&#xff0c;在服务端与客户端的数据交互方面采用序列化与反序列化进行功能判断采用以及数据传输&a…

WPF入门教程(六)--依赖属性(2)--属性值优先级与继承

一、 依赖属性的优先级 由于WPF 允许我们可以在多个地方设置依赖属性的值&#xff0c;所以我们就必须要用一个标准来保证值的优先级别。比如下面的例子中&#xff0c;我们在三个地方设置了按钮的背景颜色&#xff0c;那么哪一个设置才会是最终的结果呢&#xff1f;是Black、Re…

【论文阅读】On clustering using random walks

《On clustering using random walks》阅读笔记 1. 问题建模 1.1 问题描述 let G(V,E,ω)G(V,E,\omega)G(V,E,ω) be a weighted graph, VVV is the set of nodes, EEE is the edge between nodes in VVV, ω\omegaω is the function ω&#xff1a;E→Rn\omega&#xff1a…

网络基础2【HTTP、UDP、TCP】

目录 一.应用层 1.协议 2.网络版计算器 3.HTTP协议 &#xff08;1&#xff09;了解url和http &#xff08;2&#xff09;http的用处 &#xff08;3&#xff09;urlencode和urldecode &#xff08;4&#xff09;http协议格式 4.HTTPS协议 &#xff08;1&#xff09;加密…

《花雕学AI》用ChatGPT创造猫娘角色:人工智能角色扮演聊天对话的风险与对策

出于好奇心&#xff0c;我以“ChatGPT&#xff0c;调教猫娘”为题&#xff0c;开始了解ChatGPT角色扮演提示语的用法。ChatGPT给出的介绍是&#xff0c;调教猫娘是一种利用ChatGPT的角色扮演功能&#xff0c;让模型模仿一种类似猫的拟人化生物的行为和语言的活动&#xff0c;并…

【云原生网关】apisix使用详解

目录 一、apisix介绍 1.1 apisix是什么 二、apisix特点 2.1 多平台支持 2.2 全动态能力 2.3 精细化路由 2.4 对运维友好 2.5 多语言支持 三、apisix优势 3.1 apisix生态全景图 3.2 apisix定位 3.3 apisix优点 3.4 与nginx对比 四、apisix应用场景 4.1 Load Bala…

设计模式-结构型模式之桥接模式

2. 桥接模式2.1. 模式动机设想如果要绘制矩形、圆形、椭圆、正方形&#xff0c;我们至少需要4个形状类&#xff0c;但是如果绘制的图形需要具有不同的颜色&#xff0c;如红色、绿色、蓝色等&#xff0c;此时至少有如下两种设计方案&#xff1a;第一种设计方案是为每一种形状都提…

Python 基础(七):常用运算符

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录一、算术运算符二、按位运算符2.1 按位与 &2.2 按位或 |2.3 按位异或 ^2.4 按位取反…

Three.js教程:顶点颜色数据插值计算

推荐&#xff1a;将 NSDT场景编辑器 加入你3D工具链 其他工具系列&#xff1a; NSDT简石数字孪生 顶点颜色数据插值计算 上节课自定义几何体给大家介绍了一个顶点位置坐标概念&#xff0c;本节课给大家介绍一个新的几何体顶点概念&#xff0c;就是几何体顶点颜色。 通常几何体…

python学习笔记(二)IF、FOR、WHILE、break、continue、函数定义与调用、面向对象

笔记二 流程控制if条件语句for循环语句while循环语句break 和continue python 函数定义与调用函数与调用函数的脚本分离脚本模板函数参数匿名参数变量作用域全局变量与局部变量 python面向对象类的创建实例的创建属性、方法的访问属性的添加、删除和修改属性的访问python内置类…

( “树” 之 前中后序遍历 ) 144. 二叉树的前序遍历 ——【Leetcode每日一题】

基础概念&#xff1a;前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序&#xff1a;[1 2 3 4 5 6]前序遍历顺序&#xff1a;[1 2 4 5 3 6]中序遍历顺序&#xff1a;[4 2 5 1 3 6]后序遍历顺序&#xff1a;[4 5 2 6 3 1] 层次遍历使用 BFS 实现&#xff0c;利用的就是 BFS…

写不了博客了吗?

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

像素的奇妙冒险:使用 Python 玩转彩色图片的灰度处理

文章目录 参考描述模块PillowPILPillow获取 Numpy获取 使用 Pillow 实现图片的灰度处理ImageOps.grayscale()convert() 原理灰度模式与彩色模式图片表示与三维数组ImageOps.grayscale() 与 convert(L) 背后的逻辑心理学灰度加权公式 Python 实现灰度模式下的灰度图片彩色模式下…

基于遥感的自然生态环境检测——实验三:生态因子提取

实验三&#xff1a;生态因子提取 一、实验目标 生态因子生成&#xff1b;生态因子归一化&#xff1b;生态环境评价 二、实验内容 根据经过大气校正后的影像生产土地覆盖指数、土壤指数以及坡度等&#xff0c;对土地覆盖指数、土壤指数以及坡度进行密度分割归一化&#xff1…