【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

文章目录

  • 一、Spring新注解
    • 1.1、Configuration注解
      • 1.1.1、定义一个类
      • 1.1.2、使用Configuration注解修饰类
      • 1.1.3、作用
    • 1.2、Bean注解
      • 1.2.1、定义bean
      • 1.2.2、在主配置类中注册bean
      • 1.2.3、测试容器中是否有该bean
      • 1.2.4、注册bean的同时可以指定bean名称
      • 1.2.5、补充内容
        • 1.2.5.1、案例1【方法有参数】
        • 1.2.5.2、案例2
    • 1.3、ComponentScan注解
      • 1.3.1、案例1
      • 1.3.2、案例2
      • 1.3.3、案例3
    • 1.4、Scope注解
      • 1.4.1、定义Bean
      • 1.4.2、注册Bean并定义作用域
      • 1.4.3、测试
      • 1.4.4、将Bean的作用域改为多例
      • 1.4.5、测试1
      • 1.4.6、测试2
    • 1.5、Lazy注解
      • 1.5.1、注册Bean
      • 1.5.2、测试
      • 1.5.3、总结
    • 1.6、Conditional注解【了解】
      • 1.6.1、定义两个Bean
      • 1.6.2、定义两个类实现Condition接口
      • 1.6.3、注册Bean
      • 1.6.4、测试1
      • 1.6.5、测试2
      • 1.6.6、总结
    • 1.7、Import注解
      • 1.7.1、用法一
        • 1.7.1.1、定义Bean
        • 1.7.1.2、注册Bean
        • 1.7.1.3、测试容器中是否有该Bean
        • 1.7.1.4、注意
      • 1.7.2、用法二
        • 1.7.2.1、定义Bean
        • 1.7.2.2、新建配置类并注册Bean
        • 1.7.2.3、Import导入配置类
        • 1.7.2.4、测试容器有哪些Bean
        • 1.7.2.5、总结
    • 1.8、PropertySource注解
      • 1.8.1、定义Pig.properties文件
      • 1.8.2、主配置类
      • 1.8.3、测试
  • 好书推荐

在这里插入图片描述

一、Spring新注解

1.1、Configuration注解

1.1.1、定义一个类

public class SpringMainConfig {}

1.1.2、使用Configuration注解修饰类

@Configuration
public class SpringMainConfig {}

1.1.3、作用

​ 使用Configuration注解修饰的类表示的是:当前类是一个配置类。该类的作用和beans.xml是一样的,换句话说,该注解所修饰的类就是用来代替beans.xml文件的。

1.2、Bean注解

1.2.1、定义bean

public class User {private Integer id;private String name;public User(Integer id, String name) {this.id = id;this.name = name;}
}

1.2.2、在主配置类中注册bean

​ 在以前,使用xml去注册bean的时候,使用的是bean标签,形如:

<bean id="user" class="cn.bdqn.User"/>

​ 现在改为使用注解,使用的是@Bean注解。

@Configuration
public class SpringMainConfig {// 给容器中注册一个bean;类型为方法返回值的类型,默认方法名作为id,即bean的名字默认是方法名@Beanpublic User user(){return new User(1,"段康家");}
}

1.2.3、测试容器中是否有该bean

@Test
public void testUser() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);User user = (User) ac.getBean("user");System.out.println(user);	// User{id=1, name='段康家'}
}

1.2.4、注册bean的同时可以指定bean名称

@Configuration
public class SpringMainConfig {// 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id// 可以再注册Bean的同时,不用方法名作为id,可以指定bean的名称。@Bean("user01")public User user(){return new User(1,"段康家");}
}

1.2.5、补充内容

1.2.5.1、案例1【方法有参数】
// 定义UserDao接口
public interface UserDao {}
// 定义UserDao接口的实现类
public class UserDaoImpl01 implements UserDao{}
// 定义UserService
public class UserServiceImpl {private UserDao userDao;// 构造方法接收UserDao类型的对象public UserServiceImpl(UserDao userDao){this.userDao = userDao;}
}

重点看主配置类:

@Configuration
public class SpringMainConfig {// 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id@Beanpublic UserServiceImpl userService(UserDao userDao){return new UserServiceImpl(userDao);}@Beanpublic UserDao userDao01(){return new UserDaoImpl01();}
}
 @Test
public void testUser() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");System.out.println(userService);
}

说明:测试后发现程序能够正常运行,说明UserDao能够正常的以构造函数参数的形式注入到UserServiceImpl类中。

总结:当我们使用Bean注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。查找的方式和Autowired注解的作用是一样的。即:Spring会从容器中根据类型注入

1.2.5.2、案例2

当然还有一种情况是:容器中注册了多个相同类型的Bean,那么Spring又是如何注入的呢?在8.2.5.1案例基础之上再添加一个UserDaoImpl02。

public class UserDaoImpl02 implements UserDao{}

在再主配置类中注册该UserDaoImpl02的Bean.

在这里插入图片描述

通过看图可以知道,有问题,不能够实现自动注入,该怎么办呢?两种方式:

a、修改方法的参数

在这里插入图片描述

b、指定Bean的名称

在这里插入图片描述

总结:本质上来说,解决方案1和解决方案2是一样的。

c、使用Qualifier注解。

​ 实际上在7.3.2章节中,已经讲到了关于Qualifier注解的使用,通过该注解实现的功能是:当系统中存在多个相同类型的bean的时候,Spring就会注入失败,这个时候就需要再根据名称实现注入,而使用Qualifier注解可以达到根据给定名称的bean实现注入 。在以前讲解的过程中,我们是把该注解应用到了对类的成员变量上 ,但是需要注意的细节是:该注解应用到成员变量上时,注入时不能单独使用,需要搭配Autowired注解 。 但是,这里有一个例外,那么就是该注解也可以应用在方法参数上。

在这里插入图片描述

特别注意:当把Qualifier注解应用在方法参数上时,可以单独使用

1.3、ComponentScan注解

==作用:==指定spring在创建容器时要扫描的包。作用就如同在配置文件中这样的定义:

<beans><context:component-scan base-package="cn.bdqn"/>
</beans>

1.3.1、案例1

第一步:定义三个Bean,分别是CatController、CatService、CatMapper,并分别用@Controller、@Service、@Repository修饰。

package cn.bdqn.controller;@Controller
public class CatController {}
package cn.bdqn.service;@Service
public class CatServiceImpl {}
package cn.bdqn.mapper;@Repository
public class CatMapper {}

第二步:要想真正的注册到容器中,就必须要让容器扫描到此注解所修饰的类所在的包。

@Configuration
@ComponentScan(value = {"cn.bdqn"})
public class SpringMainConfig {
}

第三步:测试容器中是否注册了该bean。

@Test
public void testComponentScan() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);// 获取Spring容器中已经注册好的bean,把所有bean的名字获取出来String[] names = ac.getBeanDefinitionNames();for (String name:names) {System.out.println(name);}
}
/**结果:catControllercatMappercatServiceImpl
*/

总结:默认情况下,Spring会扫描cn.bdqn包以及子包下面所有的使用@Controller、@Service、@Repository、@Component所修饰的bean注册到容器中

1.3.2、案例2

**需求:**我现在不想扫描被@Controller所修饰的类注册到容器中,即让Spring扫描不到即可。言外之意就是:把所有被@Controller所修饰的类给排除掉。

说明:定义的CatController、CatServiceImpl、CatMapper不变,使用的是案例1。唯一要修改的配置是主配置文件类。为@ComponentScan注解添加excludeFilters属性即可。

**含义:**excludeFilters的作用指定扫描的时候按照什么规则排除那些组件。

**做法:**修改主配置类,即

@Configuration
@ComponentScan(value = {"cn.bdqn"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class})}
)
public class SpringMainConfig {}

**测试:**测试代码同案例1

/**catMappercatServiceImpl
**/

1.3.3、案例3

**需求:**我现在只想扫描被@Controller所修饰的类注册到容器中,被其他修饰的注解不扫描。

说明:定义的CatController、CatServiceImpl、CatMapper不变,使用的是案例1。唯一要修改的配置是主配置文件类。为@ComponentScan注解添加includeFilters属性即可。

**含义:**includeFilters的作用指定扫描的时候只需要包含哪些组件。

**做法:**修改主配置类,即

@Configuration
@ComponentScan(value = {"cn.bdqn"},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class})}
)
public class SpringMainConfig {
}

**测试:**测试代码同案例1

/**catControllercatMappercatServiceImpl测试,发现,不仅仅Controller被扫描进来了,包括Service,Mapper也都扫描进来了,好像不起作用,没有生效,原因是在于在使用includeFilters做只包含的时候,还需要关闭默认的过滤规则【在默认情况下,Spring是扫描指定包及子包下的被@Component、@Controller、@Service等bean的。】
*/

主配置文件类修改如下:

@Configuration
@ComponentScan(value = {"cn.bdqn"},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class})},useDefaultFilters = false
)
public class SpringMainConfig {
}

测试:

/**catController测试发现:结果正常,符合预期结果,只扫描到了Controller注解。
*/

1.4、Scope注解

作用:可以改变bean的作用域。在Spring中,Bean的默认作用域是单例的。

1.4.1、定义Bean

public class User {private Integer id;private String name;public User(Integer id, String name) {this.id = id;this.name = name;}
}

1.4.2、注册Bean并定义作用域

@Configuration
public class SpringMainConfig {@Bean@Scopepublic User user(){System.out.println("对象创建啦");return new User(1,"HelloWorld");}
}

1.4.3、测试

 @Test
public void testComponentScan() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);
}
/**对象创建啦
*/

结果:注册的Bean默认是单实例的,Spring容器将会在启动的时候调用方法创建对象后放入容器中,以后每次需要拿对象了就直接从容器中拿,而且每次拿的还是同一个。

1.4.4、将Bean的作用域改为多例

@Configuration
public class SpringMainConfig {@Bean@Scope("prototype")public User user(){System.out.println("对象创建啦");return new User(1,"HelloWorld");}
}

1.4.5、测试1

@Test
public void testPrototype() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);
}
/**测试后发现容器启动的时候,多例对象并不会创建。
*/

1.4.6、测试2

 @Test
public void testPrototype() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);User user01 = (User) ac.getBean("user");User user02 = (User) ac.getBean("user");
}
/**对象创建啦对象创建啦
*/

总结:对于多实例来说,Spring容器在启动的时候并不会去调用方法创建对象并放在容器中,而是每次获取的时候才会调用方法创建对象,并且每次获取到的对象还不一样。

1.5、Lazy注解

作用:用此注解修饰的Bean表示的该Bean需要被懒加载,即不会随着Spring容器的启动而去创建。

1.5.1、注册Bean

@Configuration
public class SpringMainConfig {@Bean@Lazy(value = true)	// 开启懒加载public User user(){System.out.println("对象创建啦");return new User(1,"HelloWorld");}
}

1.5.2、测试

@Test
public void testSingleton() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);
}
/**控制台什么都没有输出,因为我们的Bean被Layz注解修饰了,即使Spring容器启动了,我们的Bean也不会去创建,只有等到了真正要用到该bean了才去创建。
*/

1.5.3、总结

  • 这个Lazy注解是针对单实例Bean才有效,因为也只有单实例Bean才会默认在容器启动的时候创建对象。
  • 懒加载:容器启动不创建对象,只有在第一次使用(获取)Bean的时候采取创建对象,并初始化。
  • 该注解的作用等价于。

1.6、Conditional注解【了解】

作用: 根据一定的条件进行判断,当满足这个条件时给容器注入Bean。

==位置:==既可以修饰类也可以修饰方法。

==需求:==当前操作系统如果是window,则注入WindoBean,如果是linux系统,则注入LinuxBean。

首先查看下@Conditional注解的源代码,即:

public @interface Conditional {// 该注解的属性值是一个Class类型的数组,数组的Class元素类型必须继承Condition接口,即元素的类型必// 须是Condition类型。Class<? extends Condition>[] value();	
}

继续Condition接口的源代码:

public interface Condition {// 提供一个返回boolean值的方法,返回true则注入bean,false则不注入boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

1.6.1、定义两个Bean

// Window的bean
public class WindowBean {private String name;public WindowBean(String name) {this.name = name;}
}
// Linux的Bean
public class LinuxBean {private String name;public LinuxBean(String name) {this.name = name;}
}

1.6.2、定义两个类实现Condition接口

// Window环境的条件
public class WindowCondition implements Condition {// context:上下文环境public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String osName = context.getEnvironment().getProperty("os.name");if (osName.contains("Windows")){return true;}return false;}
}
// Linux环境条件
public class LinuxCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String osName = context.getEnvironment().getProperty("os.name");if (osName.contains("linux")){return true;}return false;}
}

1.6.3、注册Bean

@Configuration
public class SpringMainConfig {// 如果当前环境是Winows环境则注入WindowBean@Bean@Conditional(value = {WindowCondition.class})public WindowBean windowBean(){return new WindowBean("这个是window操作系统");}// 如果当前环境是Linux环境则注入LinuxBean@Bean@Conditional(value = {LinuxCondition.class})public LinuxBean linuxBean(){return new LinuxBean("这个是Linux操作系统");}
}

1.6.4、测试1

@Test
public void testBean() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);// 查看Spring容器中所有注册的BeanString[] names = ac.getBeanDefinitionNames();for (String name:names) {System.out.println(name);	}
}
/**windowBean由于现在是在window操作系统上测试,故仅仅注册了WindowBean。
*/

1.6.5、测试2

测试下如果程序运行在linux下,是否能够注入LinuxBean?测试过程,即:运行程序的时候手动的指定运行时参数信息,步骤如下:

在这里插入图片描述

在这里插入图片描述

测试后,发现,打印的结果是:LinuxBean。

1.6.6、总结

  • 使用Conditional注解修饰在方法上,只有当条件满足的时候,即返回true,才会将所修饰的方法调用并且会创建Bean对象添加到容器中。
  • 使用Conditional也可以修饰类,比如修饰主配置类,那么假如这个主配置类中定义了很多的Bean,如果该注解修饰了一个类,则只有条件满足的时候,即返回true,那么主配置类中所定义的Bean才会注册到容器中。即:@Conditional标注在类上就决定了该类中的一批bean是否能够注入。

1.7、Import注解

在这里插入图片描述

1.7.1、用法一

​ 简单来说,Import注解可以去修饰常规组件类,意思是:所谓的常规组件类就是一个普通的Java类, 而如果这个普通的Java类被@Import注解修饰,那么也可以将这个Java类注册到Spring容器中,成为Bean。

1.7.1.1、定义Bean
public class Dog {}
1.7.1.2、注册Bean
@Configuration
@Import(value = {Dog.class})
public class SpringMainConfig {
}
1.7.1.3、测试容器中是否有该Bean
@Test
public void testDogBean() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);// 查看Spring容器中所有注册的BeanString[] names = ac.getBeanDefinitionNames();for (String name:names) {System.out.println(name);}
}
/**cn.bdqn.Dog
*/
1.7.1.4、注意

使用Import注解导入一个常规组件的时候,这个Bean的名称是类的全路径

1.7.2、用法二

​ 即Import可以导入被@Configuration注解所修饰的类,换句话说,Import注解可以去导入其他的配置类,存在的一个细节是:假如这个配置类里面也注册了多个Bean,那么同样也会将这些个Bean一并注册到Spring容器中。

1.7.2.1、定义Bean
// 奥迪
public class AuDi {}
// 宝马
public class BMW {}
1.7.2.2、新建配置类并注册Bean
// 针对系统中存在的车的一个配置类
@Configuration
public class Car {@Beanpublic AuDi auDi(){return new AuDi();}@Beanpublic BMW bmw(){return new BMW();}
}
1.7.2.3、Import导入配置类
@Configuration
@Import(value = {Car.class})
public class SpringMainConfig {
}
1.7.2.4、测试容器有哪些Bean

​ 测试代码如同8.7.1.3,结果如下:

/**cn.bdqn.Car	---> 配置类auDi		---> 配置类中的奥迪Beanbmw			---> 配置类中的宝马Bean
*/
1.7.2.5、总结
  • 测试后发现,如果Import导入的是一个配置类,那么Spring会将这个配置类、以及配置类中定义的Bean都会注册到容器中。
  • 同时,有Import注解修饰的那个配置类是主配置类,被Import注解导入的配置类也叫子配置类。例如用法二,SpringMainConfig这个配置类就是主配置类,Car这个配置类称之为子配置类。
  • 这样做的好处:可以将不同功能、不同业务的Bean单独分开配置,而不是统一的都配置到一个配置类中,单独配置,结构清晰,功能划分的也很清楚。

1.8、PropertySource注解

==作用:可以设置properties文件的位置,这样的话,就可以通过Value注解读取配置文件的内容。==该注解的作用等同于:

<context:property-placeholder location="classpath:db.properties"/>

位置:该注解通常和@Configuration注解一起使用。

1.8.1、定义Pig.properties文件

id=1
name=丁春秋

1.8.2、主配置类

@Configuration	// 主配置类
@ComponentScan("cn.bdqn")	// 扫描包,目的是能够扫描到Pig类
@PropertySource(value = {"pig.properties"})	//加载配置文件
public class SpringMainConfig {}

1.8.3、测试

 @Test
public void testPig() throws Exception{ApplicationContext ac = new AnnotationConfigApplicationContext(SpringMainConfig.class);Pig pig = (Pig) ac.getBean("pig");System.out.println(pig);	// 1,name
}

好书推荐

在这里插入图片描述

《Java官方入门教程(第9版·Java 17)》

本书针对Java SE 17做了全面细致的更新,将引导你轻松学习最新的核心Java编程技能。开篇讲述基础知识,内容涉及如何创建、编译和运行Java程序。此后浓墨重彩地描述构成Java语言核心的关键字、语法和结构。本书还涵盖Java的一些更高级特性,如多线程编程、泛型、lambda表达式、模块、记录、密封类和Swing。另外,还介绍了Java的交互式编程工具JShell。本书通俗易懂、简明扼要、详略得当,成为全球数百万读者的选择。

作者简介

[美]赫伯特·希尔特(Herbert Schildt)
Herbert是Java语言领域的权威专家,拥有伊利诺伊大学的学士和硕士学位。被International Developer杂志评为“全球最著名的编程书籍创作者之一”“。他撰写的编程书籍在全球范围内销售了数百万册,已被翻译 成所有主要的非英语语言。他撰写了大量Java方面的书籍,包括Java: The Complete Reference、Herb Schildt’s Java Programming Cookbook、Introducing JavaFX 8 Programming和 Swing: A Beginner’s Guide。还撰写了许多关于C、C++和C#的图书。Ed Burns在Secrets of the Rock Star Programmers: Riding the IT Crest一书中将Herbert列为明星程序员。尽管对计算机的所有方面都感兴趣,但Herbert主要关注计算机语言。

购书链接:点此进入

在这里插入图片描述

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

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

相关文章

JAVA IO流学习

File类&#xff1a; File类是java.io包中很重要的一个类 File类的对象可以代表一个文件或者目录&#xff0c;可以修改文件大小、文件最后修改日期、文件名等 File对象不能操作文件的具体数据&#xff0c;即不能对文件进行读和写的操作 File的构造方法&#xff1a; File&…

什么时候外部依赖接口慢拖死应用?

A应用调用B应用&#xff0c;当B应用的接口响应耗时平均都在3000ms的时&#xff0c;如果当前A调用B的请求数达300/s 那么在3s内A应用在途的请求数 300 * 3 900 &#xff0c;按照servlet原理一个http的请求需要一个线程提供服务&#xff0c;即需要900个线程提供服务&#xff0c…

政安晨【AIGC实践】(一):在Kaggle上部署使用Stable Diffusion

目录 简述 开始 配置 执行 安装完毕&#xff0c;一键运行 结果展示 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 人工智能数字虚拟世界实践 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念&#xff1a; 当我们做了一些操作 (update/delete/insert)&#xff0c;提交事务后要操作MySql中的数据。 为了能够提升性能&#xff0c;引入了两块区域&#xff1a;内存结构和磁盘结构。 磁盘结构&#xff1a; 主要存储的就是数据页&#x…

【C语言基础】:文件操作详解(前篇:准备知识)

文章目录 一、什么是文件以及文件的分类1.1 程序文件1.2 数据文件1.3 文件名 二、文本文件和二进制文件2.1 数据在文件中的存储 三、文件的打开和关闭3.1 流和标准流3.1.1 流3.1.2 标准流 3.3 文件指针3.5 文件的打开和关闭 一、什么是文件以及文件的分类 文件是指存储在计算机…

编程新手必看,学习python中字符串数据类型内容(8)

1、 Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 Hello World! var2 "Runoob"Python 访问字符串中的值 Python 不支持单…

Linux(centos7)部署spark

Spark部署模式主要有4种&#xff1a;Local模式&#xff08;单机模式&#xff09;、Standalone模式&#xff08;使用Spark自带的简单集群管理器&#xff09;、Spark On Yarn模式&#xff08;使用YARN作为集群管理器&#xff09;和Spark On Mesos模式&#xff08;使用Mesos作为集…

机器学习模型——关联规则

目录 关联规则 - 基本概念 关联规则的挖掘步骤: Apriori算法 Apriori算法简介&#xff1a; Apriori算法举例&#xff1a; Apriori算法优缺点&#xff1a; Apriori算法应用 FP-growth算法&#xff1a; FP-growth算法简介&#xff1a; FP-growth的数据结构&#xff1a; …

AI帮助写代码:在python中,如何替换字符串中指定位置的字符

用python编写一段代码&#xff0c;在下面的字符串中:#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28#29&#xff0c;从第2个‘#开始&#xff0c;每个#前面加一个字符串 or ‘。 # 原始字符串 s "#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#…

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时&#xff0c;这个线程只会使用一次并且执行的任务是固定的&#xff0c;等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

2024最新GPT4.0使用教程:GPTs,AI绘画,AI换脸,AI绘画,文档分析一站式解决

一、前言 ChatGPT3.5、GPT4.0、相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普通用户来说都是需要额外付费才可以…

超强AI辅助工具:BitoCLI的简单使用

今天要推荐一个爱不释手的好东西–Bito; 从事相关工作的人大概率在自己的代码编辑器中已经用上了Bito的插件版本&#xff0c;所以这里主要介绍的是一个适合与所有人且方便快捷的Bito CLI&#xff0c;也就是Bito的命令行版本。 BitoCLI 从官方介绍来看&#xff0c;这是一款为 …

卸载不留痕,App Cleaner Uninstaller助你打造清爽Mac

在数字时代&#xff0c;我们的Mac设备上积累了大量的应用程序&#xff0c;其中一些可能不再需要或不再使用。随着时间的推移&#xff0c;这些不再使用的应用程序可能会占用宝贵的存储空间&#xff0c;影响设备的性能。为了解决这个问题&#xff0c;App Cleaner & Uninstall…

【C+ +初阶】前言篇章---C+ +的广袤

目录 1.C语言到C的过渡 2.C的发展历程 2.1C语言的诞生 2.2 c的历史版本 3.c 的地位 4. c的应用场景 4.1. 操作系统以及大型系统软件开发 所有操作系统几乎都是C/C写的 4.2. 服务器端开发 后台开发&#xff1a; 4.3. 游戏开发 4.4. 嵌入式 4.5. 数字图像处理 4.6. 人工智能 4.7.…

初始Java篇(JavaSE基础语法)(6)(继承和多态)(上)

Java学习篇 个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 继承篇 为什么需要继承&#xff1f; 继承概念 继承的语法 父类成员访问 super关键字 子类构造方法 super和this的比较 再谈…

深度学习十大算法之深度Q网络(DQN)

一、简介 深度Q网络&#xff08;DQN&#xff09;是一种结合了深度学习和强化学习的算法&#xff0c;它在近年来成为了人工智能领域的一个热点。DQN首次被引入是在2013年&#xff0c;由DeepMind的研究人员开发。它标志着深度学习技术在解决高维度决策问题上的一大突破。 DQN的…

Python可视化之pandas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.解决坐标轴刻度负号乱码2.解决中文乱码问题3.折线图Series.plot()&DataFrame.plot()4.条形图5.箱线图6.区域面积图&#xff08;堆积折线图&#xff09;7.散点…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…

关于Linux下的进程状态(进程篇)

目录 Linux操作系统的一般进程状态 关于阻塞 关于挂起 Linux内核状态源代码&#xff1a; 关于僵尸进程 关于孤儿进程 Linux操作系统的一般进程状态 新建&#xff1a;字面意思运行&#xff1a;task_struct结构体在运行队列中排队&#xff0c;就叫做运行态阻塞&#xff1a;等待非…

基于springboot实现学科竞赛管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现学科竞赛管理系统演示 摘要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。…