JavaEE 突击 5 - Spring 更简单的读取和存储对象(2)

news2024/9/22 7:35:30

Spring 更简单的读取和存储对象 - 2

  • 三 . 获取 Bean 对象
    • 3.1 属性注入
      • 3.1.1 原理
      • 3.1.2 相关问题
        • 能在启动类里面调用 [@Autowired ](/Autowired ) 注解吗
        • [@Autowired ](/Autowired ) 能使用多次吗
        • @Autowired 修饰的私有方法名字可以是其他的吗
      • 3.1.3 属性注入的优点和缺点
    • 3.2 Setter 注入
      • 3.2.1 用法
      • 3.2.2 优点以及缺点
    • 3.3 构造方法注入
      • 3.3.1 用法
      • 3.3.2 注意事项
      • 3.3.3 构造方法注入的优点
    • 3.4 同一类型多个Bean报错 -> @Resources
      • 3.4.1 用法
      • 3.4.2 @Resources 不能在构造方法上使用
      • 3.4.3 [@Resources ](/Resources ) 参数 VS [@Autowired ](/Autowired ) 参数
    • 3.5 综合练习
  • 四 . 总结

大家新年快乐 , 祝大家新的一年如图

在这里插入图片描述

这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架
JavaEE 进阶专栏

Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在

接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点

并且带领大家进行环境的配置 , 让大家真正用好框架、学懂框架

来上一篇文章复习一下吧
点击即可跳转到我的小秘密
在这里插入图片描述

本篇文章是基于在上一篇文章的进一步讲解 , 所以需要读者有上一篇文章的基础

三 . 获取 Bean 对象

我们最早的方式是这样的

package com.ethan.Controller;

import com.ethan.service.UserService;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    // 读取 UserService
    public void sayHello() {
        UserService userService = new UserService();
        userService.doService();
    }
}

直接通过 new 的方式我们是不推荐的
然后接下来进入了 2.0 时代
我们设置一个启动类 , 在里面首先要得到得到上下文对象 , 然后去使用 getBean 得到 Bean 对象 , 最后再去操作 Bean 对象 , 这种方法还是不太简便

所以迎来了我们的 3.0 时代 : 依赖注入
获取 bean 对象也叫做 对象装配 ,是把对象取出来放到某个类中,有时候也叫对象注入, 也叫做依赖注入(DI)

在程序运行期间 , 将当前类需要的对象动态的引入到当前的类当中 , 这个过程就叫做依赖注入

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

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

我们先来看一下他们的使用

3.1 属性注入

3.1.1 原理

我们就在 UserController 里面调用 UserService , 也就是将 UserService 注入到 UserController 里面 , 咱们再去调用 UserController
我们先创建一个私有的属性 , 这个属性就是我们要注入的对象
然后在这个私有属性上面加上 @Autowired 注解 (因为我们想要把 userService 注入到 UserController 里面) , 他的意思是自动装配

为什么叫属性注入呢 ?
其实是这样的 , 我们把 @Autowired 注解去掉 , 其实就剩个私有的属性 , 所以就叫属性注入

接下来我们就可以调用 userService 的方法了

package com.ethan.controller;

import com.ethan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private UserService userService;//想要注入的属性
    public void doUserController() {
        System.out.println("do UserController");
        userService.doUserService();
    }
}

我们可以去启动类看看效果了

import com.ethan.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        UserController userController = context.getBean("userController",UserController.class);

        // 3. 操作对象
        userController.doUserController();
    }
}

运行查看结果
image.png
这就说明我们在 UserController 里面成功的把 UserService 注入成功
那么我们把 @Autowired 去掉呢
image.png

3.1.2 相关问题

能在启动类里面调用 @Autowired 注解吗

那么这里面有个问题 , 我们的启动类里面还是 2.0 版本的方法 , 那么我们为什么不直接在启动类里面去添加 @Autowired 呢

import com.ethan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;

public class App {
    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        userService.doUserService();
    }
}

image.png
给大家分析一下原因
在 Java 里面 , 静态类或者静态方法优先执行
image.png

@Autowired 能使用多次吗

我们目前是在 UserController 里面注入了 UserService , 那么我们在 UserComponent 里面注入 UserController
UserComponent.java

package com.ethan.component;

import com.ethan.controller.UserController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    @Autowired
    private UserController userController;

    public void doUserComponents() {
        System.out.println("do UserComponent");
        userController.doUserController();
    }
}

UserController.java

package com.ethan.controller;

import com.ethan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private UserService userService;//想要注入的属性
    public void doUserController() {
        System.out.println("do UserController");
        userService.doUserService();
    }
}

UserService.java

package com.ethan.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void doUserService() {
        System.out.println("do UserService");
    }
}

启动类 :

import com.ethan.component.UserComponent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        UserComponent userComponent = context.getBean("userComponent",UserComponent.class);

        // 3. 操作对象
        userComponent.doUserComponents();
    }
}

image.png
打印了三句话 , 这就代表 @Autowired 可以多次使用

@Autowired 修饰的私有方法名字可以是其他的吗


那么我们改一下属性名试试看
image.png
那么为什么我们之前的名称就有要求 , 这个就没有呢
这个其实也是我们的一道面试题 : @Autowired 和 @Resource 有什么区别

这篇博客写的非常细致
@Autowired 和 @Resource 有什么区别

我们看这张图
image.png
我们的 @Autowired 是先通过类型去查找 , 比如我们这个例子
image.png
所以我们的 @Autowired 注解 是先根据类型查询 , 之后根据名称查询

3.1.3 属性注入的优点和缺点

优点 : 写法简单
缺点 :

  1. 最重要的缺点就是 IDEA 不推荐我们使用 ! 我们在 社区版里面看不见 , 去专业版里面给大家看一下 , 学生可以去学生认证使用专业版

    但是比较有意思的是 : Spring 官方放出来的 代码样例 , 自己也这么用 , 因为他真的简单易用
  2. 功能缺陷 : 不能注入一个 final 修饰的属性
    image.png
    这是因为 Java 语法规定 , final 修饰的变量必须要有初始值

可以这样解决

  1.  final 修饰的变量我们可以初始化<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28016775/1670681137539-c5f223e2-4dc7-4efa-9efb-24bc55c194b5.png#averageHue=%2363604a&clientId=u0b9d3e7e-71b6-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=817&id=ue4be36dd&name=image.png&originHeight=1021&originWidth=1920&originalType=binary&ratio=1&rotation=0&showTitle=false&size=177873&status=done&style=none&taskId=u664c54cb-a6eb-402e-bd6f-ef15bea1468&title=&width=1536)
  2.  在构造方法里面赋值<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28016775/1670681185645-0735b0a8-b853-4bed-ad3f-586d4f800017.png#averageHue=%2363614b&clientId=u0b9d3e7e-71b6-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=817&id=uc13f119a&name=image.png&originHeight=1021&originWidth=1920&originalType=binary&ratio=1&rotation=0&showTitle=false&size=191674&status=done&style=none&taskId=ua37fc8e3-d521-4ae8-b8a6-46fabf77725&title=&width=1536)
  1. 通用性问题 : 属性注入这种方式只适用于 IoC 容器(框架) -> 可移植性不高
  2. 设计原则问题 : 因为这种方式写法比较简单 , 所以就有可能造成滥用 , 更容易违背单一设计原则

单一设计原则 : 这个类设计出来只干一件事

3.2 Setter 注入

3.2.1 用法

还是先写一个私有的属性
然后去生成他的 set 方法
image.png
image.png
image.png
这样我们的 setter 方法就构造好了
image.png
接下来 , 我们只需要在 setter 方法上面加上 @Autowired 注解就好了
image.png

package com.ethan.component;

import com.ethan.controller.UserController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    private UserController userController;

    @Autowired
    public void setUserController(UserController userController) {
        this.userController = userController;
    }

    public void doUserComponents() {
        System.out.println("do UserComponent");
        userController.doUserController();
    }
}

我们试一下可不可以
去启动类编写代码

import com.ethan.component.UserComponent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        UserComponent userComponent = context.getBean("userComponent",UserComponent.class);

        // 3. 操作对象
        userComponent.doUserComponents();
    }
}

运行一下
image.png

3.2.2 优点以及缺点

优点 : 符合单一设计原则 , 一个 set 就是针对一个对象的
缺点 :

  1. 不能注入不可变对象
    image.png
  2. 注入对象可能会被改变
    因为这个 set 方法可以会被调用多次 , 就有可能造成被修改的风险

3.3 构造方法注入

3.3.1 用法

还是先写一个要注入的私有属性 , 然后生成这个类的构造方法
image.png
image.png
image.png
这样构造方法就自动生成好了 , 构造方法里面的参数就是要注入的属性
image.png
最后在构造方法上面添加 @Autowired 注解
UserComponent.java :

package com.ethan.component;

import com.ethan.controller.UserController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    private UserController userController;

    @Autowired
    public UserComponent(UserController userController) {
        this.userController = userController;
    }

    public void doUserComponents() {
        System.out.println("do UserComponent");
        userController.doUserController();
    }
}

启动类

import com.ethan.component.UserComponent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        UserComponent userComponent = context.getBean("userComponent",UserComponent.class);

        // 3. 操作对象
        userComponent.doUserComponents();
    }
}

运行一下 :
image.png
根据运行结果 , 我们还可以看出 : 构造方法也支持注入多个对象

3.3.2 注意事项

当前类只有一个构造方法的时候 , @Autowired 可以省略
image.png
有多个构造方法的时候 , @Autowired 不可以省略
image.png
image.png
而且要关注的是 : 多个构造方法的时候 , 只会运行加了 @Autowired 的构造方法
image.png
image.png
那么我们都加上 @Autowired 呢 ?
image.png
总结一下 : 在 Spring 中 , 一个类的构造方法可以有多个 , 但是只能有一个构造方法上添加 @Autowired 注解 , 否则会报错

3.3.3 构造方法注入的优点

优点1 : 可以注入 final 修饰的对象

原因 : 遵循了 Java 的规范
final 的用法 :

  1. 创建时直接赋值

  2. 在构造方法中赋值

这样就不难理解了 , 在 Java 里面就允许通过构造方法给被 final 修饰的值进行赋值 , 那么我们的 Spring 里面也可以通过构造注入对 final 修饰的值进行赋值

那么我们就来实验一下 :

package com.ethan.component;

import com.ethan.controller.UserController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    private final UserController userController;

    @Autowired
    public UserComponent(UserController userController) {
        this.userController = userController;
    }

    public void doUserComponents() {
        System.out.println("do UserComponent");
        userController.doUserController();
    }
}

image.png
优点2 : 注入对象不能被修改 (构造方法只会被执行一次)
优点3 : 要注入的对象在使用前一定会被完全初始化 , 因为注入依赖是在类的构造方法中执行的 , 而构造方法是在类创建之初就会执行的方法
优点4 : 通用性更好 , 因为构造方法是 Java (JDK) 所支持的 , 而 JDK 我们可以认为是 Spring 最低层的框架 , 所以更换任何的框架 , 它都是适用的


缺点 : (优点那么多 , 缺点就变得不是那么重要了)
构造方法不满足单一设计原则

Spring 4.2 推荐的注入用法是 Setter 注入 , Setter 更加符合单一设计原则
在 Spring 4.2 之后 , 推荐使用构造方法注入的方式 . 官方给出的回复是 如果你写的代码传递了太多的参数 , 那么此时你要考虑一下你的代码是否符合单一设计原则了

其实就是官方赖你了 , 你自己代码写的不好 , 还赖上我了 .

3.4 同一类型多个Bean报错 -> @Resources

3.4.1 用法

这是另外一个注入关键字 , 是由 Java 官方提供给我们的注解
用法是跟我们 @Autowired 大致是一样的
我们新创建一个 resources 包 , 新建一个 ReSourcesTest 来试验一下 @Resources
然后在 ReSourcesTest.java 编写代码

package com.ethan.reSources;

import com.ethan.component.UserComponent;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class ReSourcesTest {
    @Resource
    private UserComponent userComponent;

    public void doResource() {
        System.out.println("do Resource");
        userComponent.doUserComponents();
    }
}

我们 Ctrl + 单击 一下 @Resources

发现 @Resources 是来自于 Java 提供给我们的方法
那么我们就来试试 Java 给我们提供的办法好不好使
启动类 :

import com.ethan.component.UserComponent;
import com.ethan.reSources.ReSourcesTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        ReSourcesTest reSourcesTest = context.getBean("reSourcesTest",ReSourcesTest.class);
        // 3. 操作对象
        reSourcesTest.doResource();
    }
}

image.png
那么属性注入可以 , Setter 注入 以及 构造方法注入呢 ?
Setter 注入可以

package com.ethan.reSources;

import com.ethan.component.UserComponent;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class ReSourcesTest {
    private UserComponent userComponent;
    @Resource
    public void setUserComponent(UserComponent userComponent) {
        this.userComponent = userComponent;
    }

    public void doResource() {
        System.out.println("do Resource");
        userComponent.doUserComponents();
    }
}

image.png
但是构造方法注入不可以 !

package com.ethan.reSources;

import com.ethan.component.UserComponent;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class ReSourcesTest {
    private UserComponent userComponent;
    
    @Resource
    public ReSourcesTest(UserComponent userComponent) {
        this.userComponent = userComponent;
    }
    
    public void doResource() {
        System.out.println("do Resource");
        userComponent.doUserComponents();
    }
}

image.png
强行执行仍然会报错的
image.png

3.4.2 @Resources 不能在构造方法上使用

那么既然 @Autowired 能用 , 我们为什么还要介绍 @Resources 呢 ?
功能 : 实现对象注入

  1. 使用1 : 实现属性注入
  2. 使用2 : 实现 Setter 注入
  3. **@Resource 注解不能使用在构造方法的实现上 **

    原因是 : Java 实现的时候 , 构造方法是先执行的 , 但是这个注解是在构造方法之后执行的 , 所以目前是不支持这种实现的

3.4.3 @Resources 参数 VS @Autowired 参数

我们直接看源码
先看 @Resources
Ctrl + 单击 @Resources

再看 @Autowired

他们两个支持的参数完全不同 , 就这么一看 , 还是感觉 @Resources 能用的方法多
给大家举个栗子 :
当使用 Bean 注解返回两个类型相同的 Bean 的时候 , 默认使用注入的方式得到对象就会报错 , 这么说大家有点乱 , 用代码来看一下
在之前的 UserBeans 里面有两个方法 , 他们的返回值相同 , 都是 User
UserBean.java :

package com.ethan.userbean;

import com.ethan.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

@Controller
public class UserBean {
    @Bean("anlingrong")
    public User func() {
        // 构建测试数据
        User user = new User();
        user.setName("安陵容");
        user.setAge(18);
        user.setId(1);
        return user;
    }

    @Bean("shenmeizhuang")
    public User func2() {
        User user = new User();
        user.setName("沈眉庄");
        user.setAge(20);
        user.setId(2);
        return user;
    }
}

image.png
然后新建一个类 UserBean2 , 先试验一下 @Autowired
image.png

package com.ethan.userbean;

import com.ethan.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserBean2 {
    @Autowired
    private User user;

    public void method() {
        System.out.println(user.getName());
    }
}

然后设置启动类

import com.ethan.component.UserComponent;
import com.ethan.reSources.ReSourcesTest;
import com.ethan.userbean.UserBean2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 使用 getBean 得到 Bean 对象
        UserBean2 userBean2 = context.getBean("userBean2",UserBean2.class);
        // 3. 操作对象
        userBean2.method();
    }
}

运行就报错了
image.png
@Autowired 是先按照类型去找 , 如果找到了 , 但是找到了不止一个的话 , 就需要按名字去查询 .
如果还没找到 , 那就报错 .
那么我们这个例子 , 类型找到了 , 这种类型对应了两个 Bean 对象 , 那么按名字找 , 没找到名字叫做 user 的方法名 , 就报错了.
我们也可以演示一下按名字能找到的场景
image.png
那么其实我们可以使用 @Resources 来避免这种情况
@Resources 就是先按照名字来找
image.png

package com.ethan.userbean;

import com.ethan.model.User;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserBean2 {
    @Resource(name="anlingrong")
    private User user;

    public void method() {
        System.out.println(user.getName());
    }
}

因为 @Resources 是先找名字再找类型 , 所以我们可以指定 @Resources 参数为我们想要的 Bean 对象的名称
那么感觉 @Resources 挺好用的啊 , 但是不要忘了 , @Resources 是不支持构造方法注入的 , 而我们的 Spring 还推荐使用构造方法注入 , 那怎么办呢 ?
那就需要请出我们另外一个注解了 @Qualifier , 翻译成中文就是筛选的意思 .
我们需要结合 @Qualifier 和 @Autowired 来使用了
@Qualifier里面有个 value 参数 , 填写我们想要获取的 Bean 对象即可
UserController3.java

package com.ethan.userbean;

import com.ethan.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserBean2 {
    @Autowired
    @Qualifier(value="shenmeizhuang")
    private User user;

    public void method() {
        System.out.println(user.getName());
    }
}

运行一下
image.png

3.5 综合练习

在 Spring 项目中 , 通过 main 方法获取到 Controller 类 , 调用 Controller 里面通过注入的方式调用 Service 类 , Service 再通过注入的方式获取到 Repository 类 , Repository 类里面有一个方法构建一个 User 对象 , 返回给 main 方法 . Repository 无需连接数据库 , 使用伪代码即可 .
解释一下 : 首先 , 创建一个 Spring 项目 , 然后创建三个类 Controller类、Service类、Repository类 , 然后在 Controller类 里面注入 Service 对象 , 在 Service类 里面注入 Repository类 , 然后在 Repository类 里面创建一个 User 对象(因为我们还没学连接数据库 , 所以就先通过这种方式凑活用) , 最后写一个启动类 , 调用 Controller 就可以获取到其他相关信息

四 . 总结

  1. 将对象存储到 Spring 中 :
    1. 使用类注解 :
      1. @Controller
      2. @Service
      3. @Repository
      4. @Configuration
      5. @Component
    2. 使用方法注解 : @Bean (注意 : 必须配合类注解一起使用)
  2. Bean 的命名规则
    1. 首字母大写 , 第二个字母不大写 : 首字母小写获取 Bean
    2. 首字母 第二个字母都是大写 : 使用原类名获取 Bean
  3. 从 Spring 中获取对象
    1. 属性注入
    2. Setter 注入
    3. 构造方法注入(Spring 官方推荐)
  4. 注入的关键字 :
    1. @Autowired
    2. @Resource
    3. 区别 :
      1. 出身不同 : @Autowired 来自于 Spring , @Resource 来自于 JDK
      2. 使用时可设置的参数不同
  5. 解决同一类型多个 Bean 的报错
    1. 使用 @Resource(name=“”)
    2. @Autowired 搭配 @Qualifier(“”) 使用

到此 , 这篇文章就已经结束了 , 欢迎大家的阅读 , 有问题及时私信我 , 欢迎提供错误
点击此链接获得更加好的阅读体验
在这里插入图片描述

点击即可跳转到我的小秘密

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

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

相关文章

关于Kubernetes 桌面客户端 Aptakube 的一些笔记整理

写在前面 分享一个 k8s 桌面客户端 AptakubeAptakube 不是一个开源的产品&#xff0c;现在需要付费&#xff0c;最初是开源的这里简单了解下理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0c;為何竟如此艱難呢 ------赫尔曼黑塞《…

redis学习看这一篇文章就够了

第一章 redis简介 第1节 NoSQL 1.1 NoSQL简介 NoSQL&#xff0c;泛指非关系型的数据库&#xff0c;NoSQL即Not-Only SQL&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;非…

使用Stable-Diffusion生成视频的完整教程

本文是关于如何使用cuda和Stable-Diffusion生成视频的完整指南&#xff0c;将使用cuda来加速视频生成&#xff0c;并且可以使用Kaggle的TESLA GPU来免费执行我们的模型。 #install the diffuser package#pip install --upgrade pip!pipinstall--upgradediffuserstransformerssc…

JUC并发编程(1.Java线程)

博客指南&#x1f4a1; JUC并发编程博客将持续更新&#xff0c;内容将参考黑马程序员深入学习Java并发编程以及相关阅读的书籍&#xff0c;内容包括进程&#xff0c;线程&#xff0c;并发和并行。 学习的路上永远不是一个人&#xff0c;相信努力会有所收获&#xff01; 希望我的…

【自步课程学习】 Paced-Curriculum Learning

引入: Confidence-Aware Paced-Curriculum Learning by Label Smoothing for Surgical Scene Understanding 【Code:https://github.com/XuMengyaAmy/P-CBLS】 先说

JavaEE初阶第二课:文件操作与IO

欢迎来到javaee初阶的第二课&#xff0c;这节课我会带大家了解文件的概念和java中如何操作文件。 这里写目录标题1.了解文件1.1文件概念1.2文件存储1.3文件路径2.Java中的文件操作&#xff08;文件系统操作&#xff09;2.1File类2.1.1方法实践3.Java的文件操作&#xff08;文件…

字节青训前端笔记 | Webpack入门

本节课将重点围绕「 Webpack 」这一核心话题展开。简述前端工程化的常用工具webpack 的原理和使用 webpack的作用 webpack的作用是把很多文件打包整合到一起, 缩小项目体积, 提高加载速度&#xff0c;常用的场景是&#xff1a; 代码压缩 将JS、CSS代码混淆压缩&#xff0c;…

25. 迭代器和生成器的详解

1. 迭代器 (1) 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 (2) 迭代器是一个可以记住遍历的位置的对象。 (3) 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 (4) 迭代器有两个基本的方法…

Tkinter的Canvas控件

Canvas控件是Tkinter界面设计的一个画图工具&#xff0c;也可以用它导入外部图案到界面中 创建画布 import tkinter as tk roottk.Tk() #创建界面 root.title(Canvas) #界面命名 root.geometry(500x300) #设置界面大小 canvastk.Canvas(root) …

03_class创建device创建_kobject_uevent发送

总结 根据之前的kobject知道 /sys/目录下的每个文件夹都是一个 kobject的对象 使用class_create() 创建 /sys/class/xxx目录 同时返回class对象 使用device_create() 创建/sys/class/xxx/yyy目录 和创建/dev/yyy的文件节点 同时返回device对象 class和device 都间接继承于kobj…

【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;今天咱们来开箱一件特殊的奖品&#xff0c;来自华为开发者联盟社区的新年祝福——2022年牛人之星。 华为有钱&#xff01;惯例用的是顺丰快递&#xff0c;各位看一下这里面是有很多件的 有这两件。第一…

三、TCP/IP---ARP和ICMP协议

ARP协议 简介&#xff1a;号称TCP/IP中最不安全的协议&#xff0c;安全工具&#xff0c;黑客工具大多数基于ARP协议。它是地址解析协议&#xff0c;用于实现从IP到MAC地址的映射&#xff0c;即询问目标Ip对应的MAC地址是多少&#xff0c;局域网通信不仅需要源目地址封装&#…

学习率衰减、局部最优、Batch归一化、Softmax回归

目录1.学习率衰减(Learning rate decay)在训练初期&#xff0c;梯度下降的步伐大一点&#xff0c;开始收敛的时候&#xff0c;小一些的学习率能让步伐小一些。1 epoch 遍历一遍训练集学习率衰减公式&#xff1a;例&#xff1a;假设衰减率decayrate 1&#xff0c;0.2epochNumα…

蓝桥杯-刷题-补基础

十道入门题 题目来源,题目,简单解析,代码,输入输出 目录 前言 一,汉诺塔 二,判断闰年 三,大写变小写 四&#xff0c;破译密码 五&#xff0c;反向数相加 六&#xff0c;Excel表中的列号 七&#xff0c;饮料兑换 八&#xff0c;角谷猜想 九&#xff0c;数字统计…

小喵2022年的年度总结,啊滴妈呀,开了眼了。

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

Qt扫盲- QUdpSocket 类理论总结

QUdpSocket 类理论总结一、概述二、使用流程三、QNetworkDatagram 简述一、概述 UDP (User Datagram Protocol)是一种轻量级的、不可靠的、面向数据报的、无连接的协议。当可靠性不重要时&#xff0c;可以使用它。QUdpSocket是QAbstractSocket的子类&#xff0c;允许发送和接收…

SpringBoot+Vue--token,vue导航守卫,axios拦截器-笔记3

自己学习记录,写的不详细,没有误导,不想误导 大概的登录逻辑,前后端完整实现: 1.用户名,密码验证成功后,后端签发token返回给前端 2.前端把token保存到本地存储 3.每次请求前,通过axios请求拦截器,统一发送token 4.通过Vue导航守卫,和axios响应拦截器,统一保护页面 新建个…

【华为上机真题 2023】事件推送

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

机制设计原理与应用(四)预算可行的拍卖机制

文章目录4 预算可行的拍卖机制4.1 特征4.2 使用案例4.3 拍卖设计问题4.4 单调次模函数&#xff08;Monotone Submodular Function&#xff09;4.4.1 分配算法4.4.2 关键支付计划4.4.3 特性4.5 在线预算可行的拍卖机制4.5.1 Secretary Problem(A Optimal Stopping Problem)4.5.2…

如何与他人交流-第5期

上期我们讲了打破预期,顺应主体这期我们来讲讲如何建立亲和关系(关系侧)我的别人交流,只有在不把别人当成对象(工具人),而是把对方当成主体的情况下(让别人感受到尊重),这是相互尊重的终极本质,也是唯一方法.把别人当人看.认同对方,对方也会认同你.自信从何而来自信本意为相信自…