JAVAスプリングブートプロジェクトベースの簡単な分析

新しいspringbootプロジェクトを作成します

プロジェクト名:04-springboot-notice

1.エンジニアリングにおける依存関係を分析する

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--parent工程中提供了很多项目的基础依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--我们自己当前项目的坐标-->
    <groupId>com.cy</groupId>
    <artifactId>04-springboot-notice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>04-springboot-notice</name>
    <description>Demo project for Spring Boot</description>

    <!--项目属性的配置(jdk的版本,将来还可以自己定义依赖的版本)-->
    <properties>
        <java.version>1.8</java.version>
        <springboot.starter.version>2.3.8</springboot.starter.version>
    </properties>
    <dependencies>
        <!--springboot 工程的启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--springboot 工程中的单元测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <!--排除一些不需要的依赖-->
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <!--项目构建或打包时候需要的一些依赖-->
        <plugins>
            <!--假如当前插件显示红色,可以为指定Version-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.8.RELEASE</version>
            </plugin>
        </plugins>
    </build>

</project>

2.スタートアップクラス名をNoticeApplicationとして変更します

スタートアップクラスは実行時に何をしますか?

1. ClassLoaderを介して、指定されたパッケージのクラスをメモリにロードします(クラスローダー-ディスク内のクラスをメモリに読み込む責任があります)。
2.スレッド(スレッド)を使用してio(InputStream)を呼び出し、ディスク(ディスク)からファイル(ファイル)情報を読み取ります
。3。クラス(@ Component、@ Service、@ Controller ...)の説明を読み取り、に基づいてビルドします。説明、オブジェクトの構成(BeanDefinition)、ストレージクラスの構成情報(クラスのフルネーム、スコープ...)
4。クラスの構成情報に基づいてクラスのインスタンス(オブジェクト)を構築し、保存します(オブジェクトプール)。 -使用時にプールから取得)
5。クラスのインスタンスが必要な場合は、オブジェクトプール(Bean)から取得できます。

package com.cy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类在运行时都会做什么呢?
 * 1.通过ClassLoader(类加载器-负责将磁盘中的类读到内存中)将指定包的类加载到内存。
 * 2.通过线程(thread)调用io(InputStream)从磁盘(Disk)读取文件(File)信息
 * 3.读取类上的描述(@Component,@Service,@Controller...)并基于描述构建
 * 配置对象(BeanDefinition),存储类的配置信息(类全名,作用域....)
 * 4.基于类的配置信息构建类的实例(对象),并进行存储(对象池-用时从池中取)
 * 5.当我们需要一个类的实例时,可以从对象池(Bean)中获取即可
 * <p>
 * JVM参数分析
 * 1.检测
 */
@SpringBootApplication
public class NoticeApplication {
    
    //object.class

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

}

2.1JVM呼び出しパラメーター分析を使用する

クラスのロードを確認します:-XX:+ TraceClassLoading

ここに画像の説明を挿入
ここに画像の説明を挿入


パラメトリック分析

新しいPackageTestsクラスを作成します
package com.cy.java.reflect;

import java.io.File;
import java.net.URL;

public class PackageTests {
    
    
    public static void main(String[] args) {
    
    
        //获取类的字节码
        Class<?> c = PackageTests.class;
        //获取所在的包
        Package aPackage = c.getPackage();
        //获得具体的包名
        String name = aPackage.getName();
        System.out.println(name);//com.cy.java.reflect
        //将包结构转换为目录结构
        String diaName=name.replace(".", "/");
        System.out.println(diaName);
        //通过类加载器获取dirName对应的绝对路径
        URL url=
        ClassLoader.getSystemClassLoader().getResource(diaName);
        //获取路径对应的文件File对象
        File file=new File(url.getPath());
        //获取目录下的文件名
        String files[] = file.list();
        for(String f:files){
    
    
            System.out.println(f);
        }
    }
}

演算結果:
ここに画像の説明を挿入



新しいクラスを作成し、このクラスにアノテーションがあるかどうかを確認します
package com.cy.java.reflect;

import java.lang.annotation.*;

/**自定义注解
 * @Retention 注解用于描述定义的注解何时有效(运行时的编译)
 * @Target 注解用于描述这个注解可以描述哪些成员(类、属性、方法)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)//描述我们的类
@interface Component{
    
    }//@interface:描述的类型为主键类型(本质上是一个特殊的class)

@Component
class ClassA{
    
    }
public class AnnotationTests {
    
    
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    
    
       //检查ClassA 上是否有@Component注解描述
        //1.获取类的字节码对象
        Class<?> cls = Class.forName("com.cy.java.reflect.ClassA");
        //2.判定对象上是否有@Component注解
        boolean flag=cls.isAnnotationPresent(Component.class);
        System.out.println(flag);
        if (flag){
    
    
            Object ob1 = cls.newInstance();//反射构建类的实例
            System.out.println(ob1);
        }

        //Annotation类型上所有注解的父类类型
        Annotation atn=cls.getAnnotation(Component.class);
        System.out.println(atn);
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/QQ1043051018/article/details/113179335
おすすめ