JavaWeb笔记_SpringBoot原理

news2024/11/9 3:48:32

JavaWeb笔记_SpringBoot原理

  • 配置优先级
  • Bean管理
    • 获取Bean
    • Bean作用域
    • 第三方Bean
  • SpringBoot原理
    • 自动配置原理
      • @ComponentScan组件扫描
      • @Import导入
      • 源码跟踪
      • @Conditional
      • 自定义starter
        • 创建aliyun-oss-spring-boot-starter模块
        • 创建aliyun-oss-spring-boot-autoconfigure
  • 来源

配置优先级

命令行参数(–xxx=xxx) > java系统属性(-Dxxx=xxx) > properties > yml > yaml

配置命令行参数和java系统属性:

  1. 在IDEA中
  2. 在终端
    1. 执行maven打包指令package
    2. 执行java指令, 运行jar包
      java -Dserver.port=9000 -jar tlias-web-management-0.0.1-SNAPSHOT.jar --server.port=10010

注意事项:
Springboot项目进行打包时,需要引入插件spring-boot-maven-plugin (基于官网骨架创建项目公会自动添加该插件)

Bean管理

获取Bean

@Test
public void testGetBean(){
    //根据bean的名称获取
    DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
    System.out.println(bean1);
    //根据bean的类型获取
    DeptController bean2 = applicationContext.getBean(DeptController.class);
    System.out.println(bean2);

    //根据bean的名称 及 类型获取
    DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
    System.out.println(bean3);
}

Bean作用域

作用域说明
singleton单例, 容器内同名称的bean只有一个实例(默认值)
prototype每次使用该bean时会创建新的实例
request每个请求范围内会创建新的实例(web环境中, 了解)
session每个会话范围内会创建新的实例(web环境中, 了解)
application每个应用范围内会创建新的实例(web环境中, 了解)

注意事项:

  • 默认singleton的bean, 在容器启动时被创建, 可以使用@Lazy注解来延迟初始化(延迟到第一次使用).

第三方Bean

如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到@Bean注解.

@Configuration // 配置类
public class CommonConfig {

    // 声明第三方Bean
    @Bean // 将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
          // 通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
          // 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配
    public SAXReader saxReader(){
        return new SAXReader();
    }

}

SpringBoot原理

自动配置原理

@ComponentScan组件扫描

@ComponentScan({"com.example", "com.itheima"})
@SpringBootApplication
public class SpringbootWebConfig2Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }

}

@Import导入

//@Import({TokenParser.class}) // 引入普通类, 交给IOC
//@Import({HeaderConfig.class}) // 引入配置类, 交给IOC
//@Import({MyImportSelector.class}) // 引入ImportSelector接口实现类, 交给IOC
@EnableHeaderConfig // 封装@Import注解
@SpringBootApplication
public class SpringbootWebConfig2Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }

}

// ImportSelector
public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.example.HeaderConfig"};
    }
}

源码跟踪

@SpringBootConfiguration // 该注解与@Configuration注解作用相同, 用来声明当前也是一个配置类
@EnableAutoConfiguration // 组件扫描, 默认扫描当前引导类所在包及其子包
@ComponentScan // SpringBoot实现自动化配置的核心注解


/**
 * 1. @EnableAutoConfiguration
 * 2. @Import(AutoConfigurationImportSelector.class)
 * 3. String[] selectImports
 * 4. spring.factories(2.7.x之后不使用)和spring/...imports
 * / 

@Conditional

@Bean
//@ConditionalOnClass(name = "io.jsonwebtoken.Jwts") // 环境中存在指定的这个类, 才会将该bean加入IOC容器中
//@ConditionalOnMissingBean // 不存在该类型的bean, 才会将该bean加入IOC容器中 -- 指定类型(value属性) 或 名称(name属性)
@ConditionalOnProperty(name = "name ", havingValue = "itheima") // 配置文件中存在指定的键值对, 才会将该bean加入IOC容器中
public HeaderParser headerParser(){
    return new HeaderParser();
}

自定义starter

创建aliyun-oss-spring-boot-starter模块

仅保留pom.xml文件, 用于依赖管理, 导入自动配置模块.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

创建aliyun-oss-spring-boot-autoconfigure

// AliOSSAutoConfiguration
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {

    @Bean
    public AliOSSUtils aliOSSUtils(AliOSSProperties ailOSSProperties){
        AliOSSUtils aliOSSUtils = new AliOSSUtils();
        aliOSSUtils.setAilOSSProperties(ailOSSProperties);
        return aliOSSUtils;
    }
}
// AliOSSProperties
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }
}
// AliOSSUtils
public class AliOSSUtils {

    // @Value("${aliyun.oss.endpoint}")
    // private String endpoint;
    // @Value("${aliyun.oss.accessKeyId}")
    // private String accessKeyId;
    // @Value("${aliyun.oss.accessKeySecret}")
    // private String accessKeySecret;
    // @Value("${aliyun.oss.bucketName}")
    // private String bucketName;

    private AliOSSProperties aliOSSProperties;

    public AliOSSProperties getAilOSSProperties() {
        return aliOSSProperties;
    }

    public void setAilOSSProperties(AliOSSProperties aliOSSProperties) {
        this.aliOSSProperties = aliOSSProperties;
    }

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取阿里云OSS参数
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}
// META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.aliyun.oss.AliOSSAutoConfiguration
// maven
<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--阿里云OSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.15.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- no more than 2.3.3-->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.3</version>
    </dependency>
</dependencies>

来源

黑马程序员. JavaWeb开发教程

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

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

相关文章

opencv、dlib、paddlehub人脸检测

opencv、dlib、paddlehub检测效果对比。dlib和paddlehub的效果相对好一点。 说明&#xff1a;本文只做人脸检测不识别&#xff0c;找识别的不用看本文。 ## 部署说明 # 1. 安装python或conda # 2. 安装依赖&#xff0c;pip install -r requirements.txt # 3. 192.168.1.41 修…

Docker 基本使用

安装 Linux安装 # 1、查看当前Linux系统版本 Linux系统版本需要>3.0 [rootzjrs_test2_152 ~]# uname -a Linux zjrs_test2_152 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [rootzjrs_test2_152 ~]# uname -r 3.10.0-957.el…

Baumer工业相机堡盟工业相机如何使用BGAPI SDK控制相机数据流的开启和关闭(C#)

Baumer工业相机堡盟工业相机如何使用BGAPI SDK控制相机数据流的开启和关闭&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK控制相机数据流的方式2.使用BGAPISDK控…

AOP--@DeclareParents--引入新功能

目录 引入 解析 示例 引入 Java不是动态语言&#xff1b;一旦类编译完成了&#xff0c;我们就很难再为该类添加新的功能了切面能够为现有的方法增加额外的功能&#xff0c;为什么不能为一个对象增加新的方法呢&#xff1f;实际上&#xff0c;利用被称为引入的AOP概念&#x…

从数据开始,构建值得信赖的生成式AI应用

生成式AI有望从根本上打开新世界机遇的大门&#xff1a;从能够个性化回复的对话式聊天机器人&#xff0c;到各种应用的代码&#xff0c;再到营销传播的定制化内容......生成式AI正在彻底改变企业的运作方式。越来越多的领先企业正在构建可信的生成式AI应用&#xff0c;让它们在…

信息共享、管理协作!工程劳务管理模板让企业内部更加通畅

随着建筑行业的快速发展&#xff0c;工程劳务管理变得越来越复杂&#xff0c;同时企业也需要更加高效地管理劳务人员的信息、工资、考勤等方面。因此&#xff0c;工程劳务管理系统应运而生&#xff0c;帮助企业解决这些问题。作为一款低代码开发平台&#xff0c;百数根据市面上…

面向 MSP 的IT管理

MSP&#xff08;管理服务提供商&#xff09;是通过建立自己的网络运作中心(NOC&#xff0c;Network Operating Center)来实施管理服务的。用户的网络通过WAN与MSP的NOC相连&#xff0c;并使用加密技术保证信息在网络上的传输安全。通过NOC&#xff0c;MSP可以实现远程的管理、实…

LVS负载均衡群集----DR部署

文章目录 一、数据包流向分析二、DR模式的特点三、LVS-DR中的ARP问题四、LVS单网段DR模式部署第一步配置负载调度器第二步设置两台节点服务器第三步设置DR 服务器第四步在本地查看调度服务器 一、数据包流向分析 &#xff08;1&#xff09;客户端发送请求到 Director Server&a…

前后端 java 对接海康威视监控-hls实现h5播放

海康的获取监控预览流的接口当中支持 rtsp、rtmp、hls等协议。 这篇文章主要是说hls协议的。 贴上海康的开发平台地址&#xff0c;其中有对应的API&#xff1a;海康开发平台 1、java层面代码 这里除了main方法之外&#xff0c;有两个方法&#xff0c;分别是&#xff1a; 1&am…

【Python】一文教你如何使用 Requests 库

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

审视自己再出发,在职读研从人民大学与加拿大女王大学金融硕士项目起航

有人说&#xff0c;人生并非一帆风顺。是的&#xff0c;在人生的道路上&#xff0c;总会出现各种各样的麻烦。或者认真学习不见成效&#xff0c;或是努力工作得不到赏识。人生中最困难的事情就是审视自己&#xff0c;当我们意识到自己需要提升时&#xff0c;往往是拥有强大能量…

【Linux】线程分离和线程互斥

终于到线程互斥了~ 文章目录 前言一、线程分离 如何理解线程库和线程ID二、线程互斥总结 前言 在上一篇文章中我们学习了线程控制&#xff0c;比如创建一个线程&#xff0c;取消一个线程以及等待线程&#xff0c;这篇文章我们讲两个非常重要的概念&#xff0c;一个是线…

CDH 之 hive 升级至 hive-3.1.3 完美踩坑过程

一、准备工作 1.1 前言 这是博主在升级过程中遇到的问题记录&#xff0c;大家不一定遇到过&#xff0c;如果不是 CDH 平台的话&#xff0c;单是 hive 服务升级应该是不会有这些问题的&#xff0c;且升级前博主也参考过几篇相关 CDH 升级 hive 服务的博文&#xff0c;前面的升级…

go语言操作以太坊智能合约

操作中要注意版本问题 geth版本、golang版本等 在remix环境中写好合约后&#xff0c;进行编译得到abi文件 简单举例 Hello.sol合约 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0;contract Hello {string Msg;function setMsg(string memory _msg) public{Msg_msg…

SM2密码算法规范介绍

目录 1、SM2的密钥对 1.1、SM2公钥 1.2、SM2私钥 2、密钥数据格式 2.1、 GMT0009 2.2、 GMT0016 2.3、 GMT0018 3、加密数据格式 3.1、GMT0009 3.2、GMT0016 3.3、GMT0018 4、签名数据格式 4.1、GMT0009 4.2、GMT0016 4.3、GMT0018 1、SM2的密钥对 1.1、SM2公钥…

java版DVD影碟片出租赁系统C/S模式 java电影购票系统课程设计

系统采用c/s架构&#xff0c;当然&#xff0c;你可以服务端、客户端都在同一台电脑上运行&#xff1b; 也可以在同一局域网内服务端、客户端在其它不同电脑上运行&#xff1b; 如果你有云服务器&#xff0c;可将Service端代码部署至云服务器上&#xff0c;客户端在任何一台有…

不愧是阿里P8出手的并发编程笔记!颠覆了我以往“正确“的认知

对于一个Java程序员而言&#xff0c;能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点&#xff0c;它涉及操作系统、内存、CPU、编程语言等多方面的基础能力&#xff0c;更为考验一个程序员的内功。 那到底应该怎么学习并发编程…

浅析给水管网动态水力建模数据及其管理

摘要&#xff1a;给水管网在城市生产及生活中发挥着十分重要的作用&#xff0c;所以&#xff0c;保证其正常运行便显得尤为必要了。本文将基于给水管网动态水力建模数据及其管理展开相应的分析&#xff0c;以期促进城市给水管网运行质量的提高&#xff0c;为同行提供一些有益的…

HTML4

前序知识 认识两位先驱 计算机基础知识 计算机俗称电脑&#xff0c;是现代一种用于高速计算的电子计算机器&#xff0c;可以进行数值计算、逻辑计算&#xff0c;还具有存储记忆功能。计算机由 硬件 软件组成 C/S架构与B/S架构 上面提到的应用软件&#xff0c;又分为两大类…

软件测试之登录测试详解

一、功能测试--登录功能性测试用例包括&#xff1a;1.什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09;2.输入已注册的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b;3.输入已注册的用户名和不正确的密码&#xf…