新しい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);
}
}