JavaEE进阶学习:读取和存储对象

到了学习 JavaEE 这块要有一个思想,实现一个功能的时候,先考虑下有没有实现对应功能的注解.

在 Spring 中想要更简单的存储和读取对象的核心是使用注解,也就是我们接下来要学习 Spring 中的相关注解,来存储和读取 Bean 对象

1.存储 Bean 对象

之前我们存储 Bean 时,需要在 spring-config 中添加一行 bean 注册内容才行,如下图所示
在这里插入图片描述

而现在我们只需要一个注解就可以替代之前要写一行配置的要求

1.前置工作

在 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=""></content:component-scan>
</beans>

base-package 写自己的内容

在这里插入图片描述

2.添加注解存储 Bean 对象

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

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration

  2. 方法注解:@Bean

1.@Controller(控制器)

校验参数的合法性(类似于安检系统)

package com.wjh.demo;import org.springframework.stereotype.Controller;/*** @projectName: test-2023-11-22* @package: com.wjh.demo* @className: User* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
@Controller("userinfo")
public class User {public void sayHello() {System.out.println("Hi,User!");}
}
import com.wjh.demo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @projectName: test-2023-11-22* @package: PACKAGE_NAME* @className: App* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
public class App {public static void main(String[] args) {//1.得到容器对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到 Bean 对象User user = context.getBean("userinfo",User.class);//3.使用 Bean 对象user.sayHello();}
}

在这里插入图片描述

2.@Service(服务)

业务组装(相当于客服中心)

不做业务功能的实现

@Service
public class User {public void sayHello() {System.out.println("Hi,User!");}
}

3.@Repository(数据持久层)

实际的业务处理(实际办理的业务)

@Repository
public class User {public void sayHello() {System.out.println("Hi,User!");}
}

4.@Component(组件)

工具类层(基础的工具)

@Component
public class User {public void sayHello() {System.out.println("Hi,User!");}
}

5.@Configuration(配置)

配置层(配置)

@Configuration
public class User {public void sayHello() {System.out.println("Hi,User!");}
}

3.类注解存储 Bean 命名问题

在这里插入图片描述

默认类名首字母小写,就能获取到 Bean 对象

在这里插入图片描述
获取不到 Bean 对象

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用原类名,可以获取到 Bean 对象

我们可以在 Idea 中使用搜索关键字“beanName”

顺藤摸瓜,我们最后找到了 bean 对象的命名规则的方法:

在这里插入图片描述

public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}// 如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字```⺟也⼤写存储了if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){return name;}// 否则就将⾸字⺟⼩写char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);
}

4. 为什么要这么多类注解

为什么需要这么多的类注解也是相同的原因,就是让程序员看到类注解之后,就能直接了解当前类的用途,比如:

  • @Controller:表示的是业务逻辑层;

  • @Servie:服务层;

  • @Repository:持久层;

  • @Configuration:配置层。

程序的工程分层,调用流程如下:

在这里插入图片描述

查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现:

在这里插入图片描述

其实这些注解里面都有一个注解 @Component,说明它们本身就是属于@Component 的“子类”。

5.方法注解 @Bean

注意事项:
使用 @Bean 注解 的时候,必须要配合五大类注解一起使用
@Bean 获取时 @Bean 默认命名 = 方法名

package com.wjh.demo.model;/*** @projectName: test-2023-11-23* @package: com.wjh.demo.service.model* @className: ArticleInfo* @author: 王嘉辉* @description:* @date: 2023/11/23 19:28* @version: 1.0*/import java.time.LocalDateTime;/***普通的文章实体类*/public class ArticleInfo {private int aid;private String title;private String content;private LocalDateTime createTime;public int getAid() {return aid;}public void setAid(int aid) {this.aid = aid;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public LocalDateTime getCreateTime() {return createTime;}public void setCreateTime(LocalDateTime createTime) {this.createTime = createTime;}@Overridepublic String toString() {return "ArticleInfo{" +"aid=" + aid +", title='" + title + '\'' +", content='" + content + '\'' +", createTime=" + createTime +'}';}
}
package com.wjh.demo.service;import com.wjh.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** @projectName: test-2023-11-23* @package: com.wjh.demo.service* @className: Articles* @author: 王嘉辉* @description:* @date: 2023/11/23 19:33* @version: 1.0*/
@Component
public class Articles {@Bean   //将当前方法返回的对象存储到 IoC 容器public ArticleInfo articleInfo() {//伪代码ArticleInfo articleInfo = new ArticleInfo();articleInfo.setAid(1);articleInfo.setTitle("今天周几?");articleInfo.setContent("今天周四!!");articleInfo.setCreateTime(LocalDateTime.now());return articleInfo;}
}
import com.wjh.demo.model.ArticleInfo;
import com.wjh.demo.service.UConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @projectName: test-2023-11-23* @package: PACKAGE_NAME* @className: App* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
public class App {public static void main(String[] args) {//1.得到容器对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到 Bean 对象//User user = context.getBean("user",User.class);//UserService userService = context.getBean("userService",UserService.class);//Teacher teacher = context.getBean("teacher",Teacher.class);//UConfig uConfig = context.getBean("UConfig",UConfig.class);ArticleInfo articleInfo = context.getBean("articleInfo",ArticleInfo.class);//3.使用 Bean 对象//user.sayHello();// userService.sayHi();//teacher.sayHi();//uConfig.sayHi();System.out.println(articleInfo.toString());}
}

在这里插入图片描述

6.重命名 Bean 的几种方式

方式一:

在这里插入图片描述

package com.wjh.demo.service;import com.wjh.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** @projectName: test-2023-11-23* @package: com.wjh.demo.service* @className: Articles* @author: 王嘉辉* @description:* @date: 2023/11/23 19:33* @version: 1.0*/
@Component
public class Articles {@Bean("aaa")   //将当前方法返回的对象存储到 IoC 容器public ArticleInfo articleInfo() {//伪代码ArticleInfo articleInfo = new ArticleInfo();articleInfo.setAid(1);articleInfo.setTitle("今天周几?");articleInfo.setContent("今天周四!!");articleInfo.setCreateTime(LocalDateTime.now());return articleInfo;}
}
import com.wjh.demo.model.ArticleInfo;
import com.wjh.demo.service.UConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @projectName: test-2023-11-23* @package: PACKAGE_NAME* @className: App* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
public class App {public static void main(String[] args) {//1.得到容器对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到 Bean 对象//User user = context.getBean("user",User.class);//UserService userService = context.getBean("userService",UserService.class);//Teacher teacher = context.getBean("teacher",Teacher.class);//UConfig uConfig = context.getBean("UConfig",UConfig.class);ArticleInfo articleInfo = context.getBean("aaa",ArticleInfo.class);//3.使用 Bean 对象//user.sayHello();// userService.sayHi();//teacher.sayHi();//uConfig.sayHi();System.out.println(articleInfo.toString());}
}

方式二:

在这里插入图片描述

package com.wjh.demo.service;import com.wjh.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** @projectName: test-2023-11-23* @package: com.wjh.demo.service* @className: Articles* @author: 王嘉辉* @description:* @date: 2023/11/23 19:33* @version: 1.0*/
@Component
public class Articles {@Bean(name = "bbb")   //将当前方法返回的对象存储到 IoC 容器public ArticleInfo articleInfo() {//伪代码ArticleInfo articleInfo = new ArticleInfo();articleInfo.setAid(1);articleInfo.setTitle("今天周几?");articleInfo.setContent("今天周四!!");articleInfo.setCreateTime(LocalDateTime.now());return articleInfo;}
}
import com.wjh.demo.model.ArticleInfo;
import com.wjh.demo.service.UConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @projectName: test-2023-11-23* @package: PACKAGE_NAME* @className: App* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
public class App {public static void main(String[] args) {//1.得到容器对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到 Bean 对象//User user = context.getBean("user",User.class);//UserService userService = context.getBean("userService",UserService.class);//Teacher teacher = context.getBean("teacher",Teacher.class);//UConfig uConfig = context.getBean("UConfig",UConfig.class);ArticleInfo articleInfo = context.getBean("bbb",ArticleInfo.class);//3.使用 Bean 对象//user.sayHello();// userService.sayHi();//teacher.sayHi();//uConfig.sayHi();System.out.println(articleInfo.toString());}
}

方法三:

在这里插入图片描述

package com.wjh.demo.service;import com.wjh.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** @projectName: test-2023-11-23* @package: com.wjh.demo.service* @className: Articles* @author: 王嘉辉* @description:* @date: 2023/11/23 19:33* @version: 1.0*/
@Component
public class Articles {@Bean(name = {"bbb","ccc"})   //将当前方法返回的对象存储到 IoC 容器public ArticleInfo articleInfo() {//伪代码ArticleInfo articleInfo = new ArticleInfo();articleInfo.setAid(1);articleInfo.setTitle("今天周几?");articleInfo.setContent("今天周四!!");articleInfo.setCreateTime(LocalDateTime.now());return articleInfo;}
}
import com.wjh.demo.model.ArticleInfo;
import com.wjh.demo.service.UConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @projectName: test-2023-11-23* @package: PACKAGE_NAME* @className: App* @author: 王嘉辉* @description:* @date: 2023/11/22 19:16* @version: 1.0*/
public class App {public static void main(String[] args) {//1.得到容器对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到 Bean 对象//User user = context.getBean("user",User.class);//UserService userService = context.getBean("userService",UserService.class);//Teacher teacher = context.getBean("teacher",Teacher.class);//UConfig uConfig = context.getBean("UConfig",UConfig.class);ArticleInfo articleInfo = context.getBean("bbb",ArticleInfo.class);//3.使用 Bean 对象//user.sayHello();// userService.sayHi();//teacher.sayHi();//uConfig.sayHi();System.out.println(articleInfo.toString());}
}

当使用 @Bean 重命名之后,此时在使用方法名获取 Bean 对象就不可行了

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.@Bean 的注意事项

如果多个 Bean 使用相同的名称,那么程序执行不会报错,但是第一个 Bean 之后的对象不会被存放到容器中,也就是只有在第一次创建 Bean 的时候会将对象和 Bean 的名称关联起来,后续再有相同名称的 Bean 存储时,容器会自动忽略

2.获取 Bean 对象

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

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

  1. 属性注入
  2. 构造方法注入
  3. Setter 注入

1.属性注入

在这里插入图片描述

package com.java.demo.dao;import org.springframework.stereotype.Repository;/*** @projectName: Demo* @package: com.java.demo.dao* @className: UserRepository* @author: 王嘉辉* @description:* @date: 2023/11/23 21:38* @version: 1.0*/
@Repository
public class UserRepository {public int add() {System.out.println("Do UserRepository add method.");return 1;}
}
package com.java.demo.service;import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;/*** @projectName: Demo* @package: com.java.demo.service* @className: UserService* @author: 王嘉辉* @description:* @date: 2023/11/23 21:37* @version: 1.0*/
@Service
public class UserService {//1.属性注入@Autowired   //DI (依赖注入)private UserRepository userRepository;public int add() {System.out.println("Do UserService add method.");/*//传统写法UserRepository userRepository = new UserRepository();return userRepository.add();*//*//Spring 1.0ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");UserRepository userRepository = context.getBean("userRepository",UserRepository.class);return userRepository.add();*///Spring 2.0return userRepository.add();}
}
package com.java.demo.service;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.swing.*;import static org.junit.jupiter.api.Assertions.*;class UserServiceTest {@org.junit.jupiter.api.Testvoid add() {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");UserService userService = context.getBean("userService", UserService.class);userService.add();}
}

在这里插入图片描述

依赖注入 VS 依赖查找

  • 依赖查找依赖 Bean 名称的
  • @Autowired 依赖注入流程:首先先根据 getType (从容器中) 获取对象,如果只获取到一个,那么直接将此对象注入到当前属性上,如果获取到多个对象,才会使用 getName(根据名称) 进行匹配.
@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setId(1);user.setName("Java");return user;}@Beanpublic User user2() {User user = new User();user.setId(2);user.setName("MySQL");return user;}
}
@Controller
public class UserController4 {// 注⼊@Resourceprivate User user;public User getUser() {return user;}
}

同类型的 Bean 存储到容器多个,获取时报错:

解决方案:

1.将属性的名字和 Bean 的名字对应上

2.@Autowired 配合 @Qualifier 一起使用

@Controller
public class UserController5 {// 注⼊@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}

使用属性注入的优缺点:

优点:简洁,使用简单

缺点:

1.无法注入 final 修饰的变量

在这里插入图片描述
被 final 修饰的变量需要直接赋值或构造方法中进行赋值
它不符合 Java 中 final 的使用规范,所以就不能注入成功了

2.通用性问题:使用属性注入的方式只适用于 IoC 框架(容器)

3.设计原则问题:更容易违背单一设计原则。

使用属性注入的方式,因为使用起来很简单,所以开发者很容易在一个类中同时注入多个对象,而这些对象的注入是否有必要?是否符合程序设计中的单一职责原则?就变成了一个问题。
但可以肯定的是,注入实现越简单,那么滥用它的概率也越大,所以出现违背单一职责原则的概率也越大。
注意:这里强调的是违背设计原则(单一职责)的可能性,而不是一定会违背设计原则,二者有着本质的区别。

2. Setter 注入

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

package com.java.demo.service;import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @projectName: test-2023-11-26* @package: com.java.demo.service* @className: UserService2* @author: 王嘉辉* @description:* @date: 2023/11/26 19:52* @version: 1.0*/
@Service
public class UserService2 {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}public void sayHello() {System.out.println("Do UserService2 sayHello");userRepository.add();}
}
package com.java.demo.service;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import static org.junit.jupiter.api.Assertions.*;class UserService2Test {@Testvoid sayHello() {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");UserService2 userService2 = context.getBean("userService2", UserService2.class);userService2.sayHello();}
}

在这里插入图片描述

Setter 注入的优缺点

优点:Setter 注入它完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象

缺点:

1.无法注入 一个 final 修饰的变量

在这里插入图片描述

2.Setter 注入的对象可以被修改,Setter 本来就是一个方法,既然是方法,就有可被多次调用和修改.

在这里插入图片描述

3.构造方法注入

标准的属性注入的写法

package com.java.demo.service;import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @projectName: test-2023-11-26* @package: com.java.demo.service* @className: UserService3* @author: 王嘉辉* @description:* @date: 2023/11/26 20:13* @version: 1.0*/
@Service
public class UserService3 {private UserRepository userRepository;@Autowiredpublic UserService3(UserRepository userRepository) {this.userRepository = userRepository;}public void sayHi() {System.out.println("Do UserService3 sayHi");userRepository.add();}
}
package com.java.demo.service;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import static org.junit.jupiter.api.Assertions.*;class UserService3Test {@Testvoid sayHi() {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");UserService3 userService3 = context.getBean("userService3", UserService3.class);userService3.sayHi();}
}

在这里插入图片描述

如果只有一个构造方法,那么 @Autowired 注解可以省略

在这里插入图片描述

但是如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法

在这里插入图片描述

构造方法注入的优缺点:

优点:

1.可注入一个 final 修饰的变量

在这里插入图片描述

2.注入对象不会被修改

构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。

3.注入对象会被完全初始化

因为依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化,这也是构造方法注入的优点之一。

4.通用性更好

构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。

缺点:

1.写法比属性注入复杂

2.使用构造方法注入,解决不了循环依赖的问题(Spring 的三级缓存解决)

4.@Resource 另一种注入关键字

@Controller
public class UserController {// 注⼊@Resourceprivate UserService userService;public User getUser(Integer id) {return userService.getUser(id);}
}

@Autowired 和 @Resource 的区别

  • 出身不同:@Autowired 来自于 Spring,而@Resource 来自于 JDK 的注解;

  • 使用时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如name 设置,根据名称获取 Bean。

  • @Autowired 可用于 Setter 注入、构造函数注入和属性注入,而@Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入

  • 使用@Autowired 在IDEA 专业版可能会误报,@Resource 不存在误报问题

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

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

相关文章

跟着chatgpt一起学|1.spark入门之MLLib

chatgpt在这一章表现的不好&#xff0c;所以我主要用它来帮我翻译文章提炼信息 1.前言 首先找到spark官网里关于MLLib的链接 spark内一共有2种支持机器学习的包&#xff0c; 一种是spark.ml,基于DataFrame的&#xff0c;也是目前主流的 另一种则是spark.mllib,是基于RDD的…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

乘法原理 LeetCode 828. 统计子串中的唯一字符

我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s "LEETCODE" &#xff0c;则其中 "L", "T","C","O","D" 都是唯一字符&#xff0c;…

坚鹏:广州银行清华大学消费金融发展趋势与创新培训圆满结束

广州银行自1996年9月成立以来&#xff0c;依托中国经济腾飞的大好形势&#xff0c;成为国内具有一定知名度与地方特色的商业银行。截至2022年12月末&#xff0c;已开业机构174家&#xff0c;包括总行1家&#xff0c;分行级机构15家(含信用卡中心)、支行152家、信用卡分中心6家&…

通达信视频教程的下载地址

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/12yNV62ROERRzmyqm9u22aQ?pwdgmdx

2023-11-26 事业-代号s-跨境物流-记录

摘要: 2023-11-26 事业-代号s-跨境物流-记录 跨境物流: 【结论】 中小卖家&#xff08;最低适合1个人经营的卖家&#xff09;首选以下两种物流&#xff0c;目前已知的是以下两种&#xff0c;后续有新的发现再更新。 1、云途物流&#xff08;YunExpress&#xff09;&#xff…

【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流

文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆&#xff0c;成功带火了AIGC&#xff0c;让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…

线性模型加上正则化

使用弹性网络回归&#xff08;Elastic Net Regression&#xff09;算法来预测波士顿房屋价格。弹性网络回归是一种结合了L1和L2正则化惩罚的线性回归模型&#xff0c;能够处理高维数据和具有多重共线性的特征。弹性网络回归的目标函数包括数据拟合损失和正则化项&#xff1a; m…

torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:

批量归一化是一种加速神经网络训练和提升模型泛化能力的技术。它对每个特征维度进行标准化处理&#xff0c;即调整每个特征的均值和标准差&#xff0c;使得它们的分布更加稳定。 Batch Norm主要是为了让输入在激活函数的敏感区。所以BatchNorm层要加在激活函数前面。 1.torch.…

如何用低代码的思路设计文字描边渐变组件

前言 文字特效设计一直是困扰 Web 前端 Css 世界多年的问题, 比如如何用纯 Css 实现文字描边, 渐变, 阴影等, 由于受限于浏览器兼容性的问题, 我们不得不使用其他替代方案来实现. 平时工作中我们使用 PS 等设计工具能很容易的实现文字渐变等特效, 但是随着可视化技术的成熟, 我…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…

MyBatis的功能架构,MyBatis的框架架构设计,Mybatis都有哪些Executor执行器,Mybatis中如何指定使用哪一种Executor执行器

文章目录 MyBatis的功能架构是怎样的把Mybatis的功能架构分为三层&#xff1a; **MyBatis的框架架构设计**是怎么样的架构图如下Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;Mybatis中如何指定使用哪一种Executor执行器&#xff1f; MyBatis的功…

SASS的导入文件详细教程

文章目录 前言导入SASS文件使用SASS部分文件默认变量值嵌套导入原生的CSS导入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努…

人工智能入门教学——AI代理(AI Agent)

目录 一、简介 二、特征 三、结构 四、工作流程 五、类型 六、应用 一、简介 AI代理 (Artificial Intelligence Agent)是指使用人工智能技术和算法来执行特定任务、解决问题或实现目标的程序或系统。这些代理可以是简单的程序&#xff0c;也可以是复杂的系统&#xff0c…

面向对象编程:Rust的面向对象特性

欢迎关注我的公众号lincyang新自媒体&#xff0c;回复关键字【程序员经典书单】&#xff0c;领取程序员的100本经典书单 大家好&#xff01;我是lincyang。 今天我们将深入探讨Rust语言中的面向对象编程&#xff08;OOP&#xff09;特性&#xff0c;并将其与其他流行编程语言进…

基于U-Net的视网膜血管分割(Pytorch完整版)

基于 U-Net 的视网膜血管分割是一种应用深度学习的方法&#xff0c;特别是 U-Net 结构&#xff0c;用于从眼底图像中分割出视网膜血管。U-Net 是一种全卷积神经网络&#xff08;FCN&#xff09;&#xff0c;通常用于图像分割任务。以下是基于 U-Net 的视网膜血管分割的内容&…

mysql高级知识点

一、mysql架构 连接层&#xff1a;负责接收客户端的连接请求&#xff0c;可以进行授权、认证(验证账号密码)。服务层&#xff1a;负责调用sql接口&#xff0c;对sql语法进行解析&#xff0c;对查询进行优化&#xff0c;缓存。引擎层&#xff1a;是真正进行执行sql的地方&#x…

Linux面试题(二)

目录 17、怎么使一个命令在后台运行? 18、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息&#xff1f; 19、哪个命令专门用来查看后台任务? 20、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令? 21、终止进程用什么命令…

Vue框架学习笔记——事件修饰符

文章目录 前文提要事件修饰符prevent&#xff08;常用&#xff09;stop&#xff08;不常用&#xff09;事件冒泡stop使用方法三层嵌套下的stop三层嵌套看出的stop&#xff1a; once&#xff08;常用&#xff09;capture&#xff08;不常用&#xff09;self&#xff08;不常用&a…

Vue轻松入门,附带学习笔记和相关案例

目录 一Vue基础 什么是Vue&#xff1f; 补充&#xff1a;mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式&#xff1f; 插值表达式的缺点 解决方法 相关代…