Java “框架 = 注解 + 反射 + 设计模式” 之 注解详解
Java ”框架 = 注解 + 反射 + 设计模式“ 之 注解详解
每博一文案
刹那间我真想令时光停住,好让我回顾自己,回顾失去的年华,缅怀哪个穿一身短小的连衣裙
和瘦窄的短衫的小女孩。让我追悔少年时代,我心灵的愚钝无知,它轻易地错过了我一生中本来
可以获得欢乐和幸福。—————— 《平凡的世界》真的,如果痛苦不能改变生存,那还不如平静地将自己毁灭,毁灭,一切都毁灭了,
只有生命还在苟延残喘,这样的生命还有有什么存在的价值。—————— 《平凡的世界》
文章目录
- Java ”框架 = 注解 + 反射 + 设计模式“ 之 注解详解
- 每博一文案
- 1. 注解的概念
- 2. 注解的作用
- 3. 文档注释中的注解
- 4. 自定义注解
- 4.1 注解中的属性
- 4.2 注解中属性为:数组的赋值
- 5. JDK 内置的三个基本注解
- 5.1 @Override: 限定重写父类方法, 该注解只能用于方法
- 5.2 @Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。
- 5.3 @SuppressWarnings: 抑制编译器警告
- 6. 元注解
- 6.1 @Target
- 6.2 @Retention
- 6.3 @Documented
- 6.4 @Inherited
- 7. 通过反射获取到注解信息
- 8. 总结:
- 9. 最后:
1. 注解的概念
注解,一种元数据形式提供了一个不属于程序本身的程序的数据。注解对他们注解的代码的操作没有直接的影响。
注解有很多用途,其中:
- 编译器的信息 - 编译器可以使用注解来检测错误或抑制警告。
- 编译和部署时处理 - 软件工具可以处理注解信息以生成代码,XML 文件等。
- 运行时处理 - 一些注解可以在运行时检查
从 JDK5.0 开始,Java增加了对元数据**(MetaData)** 的支持,也就是 Annotation 注解。
- 注解: 其实就是代码里的 特殊标记 ,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用 注解,
程序员可以在不改变原有的逻辑的情况下,在源文件种嵌入一些补充的信息。代码分析工具,开发工具和部署工具可以通过这些补充信息进行验证或进行部署。
-
注解: 可以像修饰符一样被使用,可以用于 修饰:包,类,构造器,方法,成员变量,参数,局部变量的声明 。这些信息被保存在 注解 Annotaion 的“ name = value” 键值对中。
-
在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如
用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗 代码和XML配置等。
-
未来的开发模式都是基于注解的,JPA 是基于注解的,Spring2.5 以上都是基于注解的,Hibernate3.x 以后也是基于注解的,
现在Struts2 有一部分也是基于注解的了。注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式 。
2. 注解的作用
从 JVM 的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。
Java的注解可以分为三类:
- 第一类:是由编译器使用的注解:换句话说就是给编译器看的,不是给 JVM 看的。例如:
- @Override : 让编译器检查该方法是否正确的实现了 重写操作。
- @Deprecated : 表示所修饰的元素(类,方法等)已过时了,不建议使用它了。
- @SuppressWarnings: 告诉编译器忽略此处代码产生的警告。
- 第二类: 是由工具处理
.class
文件使用的注解,比如有些工具会在加载 class 的时候,对 class 做动态修改,实现一些特殊的功能。这类注解会被编译进入到.class
文件,但加载结束后并不会存在于内存中。这类注解只被一些底层使用,一般我们不必自己处理。 - 第三类: 是在程序运行期间能够读取的注解,它们在加载后一直存在于 JVM 中,这也是最常用的注解。例如:一个配置了
@PostConstruct
的方法会在调用构造方法后自动被调用,(这是Java代码读取该注解实现的功能,JVM 并不会识别该注解)。
3. 文档注释中的注解
- @author 标明开发该类模块的作者,多个作者之间使用,分割。
- @version 标明该类的模块的版本。
- @see 参考转向,也就是相关类的主题。
- @since 从哪个版本开始增加的。
- @param 对方法中某参数的说明,如果没有参数就不能写。
- @return 对方法返回值的说明,如果方法的返回值类型是 void 就不能写
- @exception 对方法可能抛出的异常进行说明,如果方法没有用 throws 显抛出的异常就不能写 其中:
- @param @ return 和 @ exeption 这三个标记都是只用于方法的。
- @param 的格式要求:@param 形参名 形参类型 形参说明
- @return 的格式要求:@return 返回值类型 返回值说明
- @exception 的格式要求:@exception 异常类型 异常说明
- @ param 和 @exception 可以并列多个。
4. 自定义注解
Annotaion注解 其实也是一种引用数据类型,编译之后也是生成 xxx.class
字节码文件的。
-
定义新的 Annotation 注解 类型使用 @interface 关键字
-
自定义注解自动实现了
java.lang.annotation.Annotation
接口
自定义注解的格式如下:
public @interface MyAnnotation {}//
[修饰列表] @interface 注解名/(注解类名) {}
使用 IDEA 创建一个 注解类型: 鼠标右键 ——> new 一个选择 :
如下查看该 我们该自定义的注解 MyAnnotation 的 UML 图:可以清楚的看到该 注解类型是自动继承了该 java.lang.annotation.Annotation
接口的
但是事实上却是自动实现了 java.lang.annotation.Annotation
接口。
在Java 8之前,注解只能是在声明的地方所使用,Java8 开始,注解可以应用 在任何地方 。这里的任何地方包括:包,类,构造器,方法,成员变量,参数,局部变量的声明 。这些信息被保存在 注解 Annotaion 的“ name = value” 键值对中。
举例如下: 并没有出现任何的报错的情况。
4.1 注解中的属性
在注解中可以定义属性。
Java中的注解中的属性:看着像方法,但实际在注解当中是属性 name
格式如下:
String value();
// 数据类型 属性名(); // 看似是方法,其实在注解中是属性
注解中的属性可以是任何类型:byte, short, int, long, float, double, boolean, char, String, long, Class, 枚举类型
。再或者是自定义类型。
举例:
public @interface MyAnnotation {String value();}
注意: 如果该注解中定义了属性,则声明使用该注解时 必须 为其注解中的属性值赋上值,不然,是会报错的。
如下,我们为该 @MyAnnotation
注解定义了属性,使用时却没有赋值,报如下编译错误。
为注解中的属性赋值的格式如下:
@MyAnnotaion(value="Tom") // 注意:在该注解中定义的是什么类型的值,就赋值对应的值,不然会报错的
// @注解名(注解中的属性名=对应赋值的属性值)
举例:
如果该注解中只有一个属性值,并且该注解的属性名为 value
,则在赋值时,可以省略其 为value的属性名,直接写值 。
注意一定要满足两个条件:1. 该注解中只有一个属性值,2.该属性名为 value
举例:
为注解中的多个属性赋值格式如下: 多个属性值,使用逗号分隔开来,就可以了。
@MyAnnotation(value = "Tom",value2 = "123")
// @注解名(注解中的属性名=值,注解中的属性名=值) :多个属性值使用逗号分隔开。
注意: 当注解中存在多个属性值时,其中所有该注解中的属性值都必须赋值,不然编译报错,如下:
必须将注解中的所有属性值都赋值上值才行:如下:如果注解中存在两个或两个以上的属性,就算其中存在一个属性名为 value
,其赋值时,该value 属性名是不可以省略的。必须写明所有的属性名的进行赋值。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
注解中的属性可以设置默认值,使用关键字``格式如下:
String value() default "Tom";
// 数据类型 属性名() default 默认值; 注意需要和定义的类型保证一致。
举例:
public @interface MyAnnotation {String value() default "Tom";}
注解中属性设置了,默认值的是可以选择不进行赋值操作,使用定义的默认值。
举例如下:
4.2 注解中属性为:数组的赋值
注解中的属性值是可以定义为数组属性的格式如下:
String[] arr(); // 定义数组为属性值
数据类型[] 属性名();
举例:
public @interface MyAnnotation {String value();String[] arr();}
注解中以数组为属性的赋值格式如下:
@MyAnnotation(value = "Tom",arr = {"hello","world"})
@注解名(属性名=值,属性名={值,值})
举例:
当数组属性所赋值的参数只有一个时,可以省略{}
花括号。如下
5. JDK 内置的三个基本注解
下面我们来认识一下,JDK 中三个常见的基本注解。
5.1 @Override: 限定重写父类方法, 该注解只能用于方法
@Override : 的作用就是在编译期间:让编译器检查该方法是否正确的实现了 重写 操作。其中的重写的方法名是否存在错误,方法的返回值类型是否是父类中/接口中的一致。不一致编译报错,提示我们改正。
@OVerride 注解的源码,可以看到该注解是没有定义属性的。
package java.lang;import java.lang.annotation.*;/*** Indicates that a method declaration is intended to override a* method declaration in a supertype. If a method is annotated with* this annotation type compilers are required to generate an error* message unless at least one of the following conditions hold:** <ul><li>* The method does override or implement a method declared in a* supertype.* </li><li>* The method has a signature that is override-equivalent to that of* any public method declared in {@linkplain Object}.* </li></ul>** @author Peter von der Ahé* @author Joshua Bloch* @jls 9.6.1.4 @Override* @since 1.5*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
注意 : 该注解只能使用在方法上(因为该注解的源码中被@Target(ElementType.METHOD)
元注解修饰了),在其他位置上是会编译报错的。如下:
@OVerride 注解的使用: 较少了我们编程程序时,上的简单符号上以及一些基本的语法错误。
5.2 @Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。
@Deprecated : 该注解表示:表示所修饰的元素(类,方法等)已过时了,不建议使用它了。建议替换成其他的方法。
@Depecated 源码: 可以看到该注解是没有定义属性的。
package java.lang;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;/*** A program element annotated @Deprecated is one that programmers* are discouraged from using, typically because it is dangerous,* or because a better alternative exists. Compilers warn when a* deprecated program element is used or overridden in non-deprecated code.** @author Neal Gafter* @since 1.5* @jls 9.6.3.6 @Deprecated*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
常见的,在我们的 java.util.lang
包下的 Date 中的 Date(String s) 构造器是被 @Deprecated 注解修饰了的。
在IDEA 中 如果我们调用了,被 @Deprecated 修饰的属性,方法,构造器,会给一个直观的将该属性/方法以删除线的方式显示处理
并提示你建议使用别的方式替换 。如下
我们也可以自己写一个这样的被@Deprecated 修饰的属性/方法/类/构造器。举例如下:
5.3 @SuppressWarnings: 抑制编译器警告
@SuppressWarnings ** :指示应该在注解元素(以及包含在该注解元素中所有程序元素中的所有程序元素)中取消显示指定的编译器警告。换句话说:就是告诉编译器忽略此处代码产生的警告**。 注意是警告不是异常。
@SuppressWarnings的源码 ,可以看到该注解定义了一个名为 value
的属性。
package java.lang;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;/*** Indicates that the named compiler warnings should be suppressed in the* annotated element (and in all program elements contained in the annotated* element). Note that the set of warnings suppressed in a given element is* a superset of the warnings suppressed in all containing elements. For* example, if you annotate a class to suppress one warning and annotate a* method to suppress another, both warnings will be suppressed in the method.** <p>As a matter of style, programmers should always use this annotation* on the most deeply nested element where it is effective. If you want to* suppress a warning in a particular method, you should annotate that* method rather than its class.** @author Josh Bloch* @since 1.5* @jls 4.8 Raw Types* @jls 4.12.2 Variables of Reference Type* @jls 5.1.9 Unchecked Conversion* @jls 5.5.2 Checked Casts and Unchecked Casts* @jls 9.6.3.5 @SuppressWarnings*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {/*** The set of warnings that are to be suppressed by the compiler in the* annotated element. Duplicate names are permitted. The second and* successive occurrences of a name are ignored. The presence of* unrecognized warning names is <i>not</i> an error: Compilers must* ignore any warning names they do not recognize. They are, however,* free to emit a warning if an annotation contains an unrecognized* warning name.** <p> The string {@code "unchecked"} is used to suppress* unchecked warnings. Compiler vendors should document the* additional warning names they support in conjunction with this* annotation type. They are encouraged to cooperate to ensure* that the same names work across multiple compilers.* @return the set of warnings to be suppressed*/String[] value();
}
举例: 这里我们定义一个 int num = 1 / 0 语句,IDEA 该我们提示了警告了。
当我们加上了 @SuppressWarnings IDEA 就没有这个警告了。如下:
具体的其他应用大家可以移步至:🔜🔜🔜
https://blog.csdn.net/qq_43842093/article/details/122386115?ops_request_misc=&request_id=&biz_id=102&utm_term=%20@SuppressWarnings%E7%9A%84%E4%BD%BF%E7%94%A8&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-122386115.142
Eclipse Galileo版本支持的抑制警告的名称:
关键字 | 用途 |
---|---|
all | to suppress all warnings (抑制所有警告) |
boxing | to suppress warnings relative to boxing/unboxing operations (抑制装箱、拆箱操作时候的警告) |
cast | to suppress warnings relative to cast operations (抑制映射相关的警告) |
dep-ann | to suppress warnings relative to deprecated annotation (抑制启用注释的警告) |
deprecation | to suppress warnings relative to deprecation (抑制过期方法警告) |
fallthrough | to suppress warnings relative to missing breaks in switch statements (抑制确在switch中缺失breaks的警告) |
finally | to suppress warnings relative to finally block that don’t return (抑制finally模块没有返回的警告) |
hiding | to suppress warnings relative to locals that hide variable(抑制相对于隐藏变量的局部变量的警告) |
incomplete-switch | to suppress warnings relative to missing entries in a switch statement (enum case)(忽略没有完整的switch语句) |
nls | to suppress warnings relative to non-nls string literals( 忽略非nls格式的字符) |
null | to suppress warnings relative to null analysis( 忽略对null的操作) |
rawtypes | to suppress warnings relative to un-specific types when using generics on class params( 使用generics时忽略没有指定相应的类型) |
restriction | to suppress warnings relative to usage of discouraged or forbidden references( 抑制禁止使用劝阻或禁止引用的警告) |
serial | to suppress warnings relative to missing serialVersionUID field for a serializable class( 忽略在serializable类中没有声明serialVersionUID变量) |
static-access | to suppress warnings relative to incorrect static access( 抑制不正确的静态访问方式警告) |
synthetic-access | to suppress warnings relative to unoptimized access from inner classes( 抑制子类没有按最优方法访问内部类的警告) |
unchecked | to suppress warnings relative to unchecked operations( 抑制没有进行类型检查操作的警告) |
unqualified-field-access | to suppress warnings relative to field access unqualified( 抑制没有权限访问的域的警告) |
unused | to suppress warnings relative to unused code( 抑制没被使用过的代码的警告) |
6. 元注解
有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解。
6.1 @Target
@Target 源码:其中存在一个类型为 ElementType[]
枚举类型数组属性名为 value
的属性。
package java.lang.annotation;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {/*** Returns an array of the kinds of elements an annotation type* can be applied to.* @return an array of the kinds of elements an annotation type* can be applied to*/ElementType[] value();
}
ElementType的枚举源码 :
/package java.lang.annotation;
public enum ElementType {/** Class, interface (including annotation type), or enum declaration */TYPE,/** Field declaration (includes enum constants) */FIELD,/** Method declaration */METHOD,/** Formal parameter declaration */PARAMETER,/** Constructor declaration */CONSTRUCTOR,/** Local variable declaration */LOCAL_VARIABLE,/** Annotation type declaration */ANNOTATION_TYPE,/** Package declaration */PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE
}
@Target : 最常用的元注解是@Target
。使用@Target
可以定义Annotation
能够被应用于源码的哪些位置:
- 类或接口:
ElementType.TYPE
; - 字段:
ElementType.FIELD
; - 方法:
ElementType.METHOD
; - 构造方法:
ElementType.CONSTRUCTOR
; - 方法参数:
ElementType.PARAMETER
。
举例:
@Target元注解中的 value 属性是枚举数组类型的,可以赋值多个值:比如表示该注解可以声明在方法,变量,类中 ,举例:
6.2 @Retention
@Retention 源码 : 我们可以看到如下注解中只定义了一个RetentionPolicy
的枚举类型名为 value
的属性名的属性
package java.lang.annotation;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {/*** Returns the retention policy.* @return the retention policy*/RetentionPolicy value();
}
RetentionPolicy 枚举类型的源码
package java.lang.annotation;public enum RetentionPolicy {/*** Annotations are to be discarded by the compiler.*/SOURCE,/*** Annotations are to be recorded in the class file by the compiler* but need not be retained by the VM at run time. This is the default* behavior.*/CLASS,/*** Annotations are to be recorded in the class file by the compiler and* retained by the VM at run time, so they may be read reflectively.** @see java.lang.reflect.AnnotatedElement*/RUNTIME
}
@Retention : 另一个重要的元注解@Retention
定义了Annotation
的生命周期:
@Rentention 时必须为该 value 成员变量指定值
- 仅编译期:
RetentionPolicy.SOURCE
表示该注解的生命周期只在编译期间有效,在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。 - 仅class文件:
RetentionPolicy.CLASS
: 在class文件中有效(即class保留) , 当运行 Java 程序时, JVM 不会保留注解。 这是默认值 - 运行期:
RetentionPolicy.RUNTIME
,注意:只有定义该属性的注解,才能被反射读取到。上面两种方式都无法被反射读取到的。
如果@Retention
不存在,则该Annotation
默认为CLASS
。因为通常我们自定义的Annotation
都是RUNTIME
,所以,务必要加上@Retention(RetentionPolicy.RUNTIME)
这个元注解:
举例:
6.3 @Documented
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。默认情况下,javadoc是不包括注解的。
- 定义为Documented的注解必须设置Retention值为RUNTIME
@Documented 的源码 从源码看,该注解没有任何属性。
package java.lang.annotation;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
6.4 @Inherited
@Inherited: 被它修饰的 Annotation 将具有继承性。如果某个类使用了被
@Inherited : 修饰的 Annotation, 则其子类将自动具有该注解。
-
比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以继承父类类级别的注解
-
实际应用中,使用较少
@Inherited 源码 从源码看,该注解没有任何属性。
package java.lang.annotation;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
7. 通过反射获取到注解信息
想要让反射可以读取到注解中的信息,则该反射中的元注解必须是: @Retention(RetentionPolicy.RUNTIME)
才行。
举例: 这里我们使用反射读取到 fun() 方法中的 注解中的 value 属性值:
注解
package blogs.blog10;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) // 生命周期在:运行期,才可以被反射读取到
public @interface MyAnnotation {String value() default "Tom";}
package blogs.blog10;import java.lang.reflect.Method;public class AnnotationTest {public static void main(String[] args) {Method method = null;try {// 获取类加载器,类对象Class clazz = Class.forName("blogs.blog10.AnnotationTest"); // 全类路径名// 获取 fun()方法method = clazz.getDeclaredMethod("fun");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}// 判断该方法是否存在该注解,存在才读取该注解上的属性值if(method.isAnnotationPresent(MyAnnotation.class)) {// 获取该注解对象MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);// // 获取该注解的属性值,就像对象.属性一样String value = annotation.value();System.out.println(value);}}@MyAnnotation("lihua")public void fun() {int num = 0;}}
8. 总结:
- 设计注解类型时,必须考虑该类型注解的基数。现在可以使用注解零次,一次,或者如果注解的类型被标记为
@Repeatable
多次。也可以通过使用@Target
元注解来限制注解类型的使用位置。例如,您可以创建只能在方法和字段上使用的可重复注解类型。重要的是仔细设计注解类型,以确保使用注解的程序员发现它尽可能灵活和强大。 - 注解的作用:减少程序中的错误,提高程序员的开发效率。以及框架上的运用。
- 注意:注解中的属性必须赋值,不然编译无法通过,除非该属性设置了默认值信息,建议注解中的属性设置上默认值。
- 当注解中只有一个属性,并且该属性名为
value
,则在赋值上可以省略属性名。 - 注解多个值上的赋值,以及数组类型的属性值的赋值。
- 元注解:修饰注解上的注解,特别掌握:@Target,@Retention 这两个元注解,其中的属性值上的赋值的意义。
9. 最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善 。谢谢大家,江湖再见,后会有期 !!!
相关文章:
Java “框架 = 注解 + 反射 + 设计模式” 之 注解详解
Java ”框架 注解 反射 设计模式“ 之 注解详解 每博一文案 刹那间我真想令时光停住,好让我回顾自己,回顾失去的年华,缅怀哪个穿一身短小的连衣裙 和瘦窄的短衫的小女孩。让我追悔少年时代,我心灵的愚钝无知,它轻易…...
特斯拉4D雷达方案首次曝光!高阶智驾市场比拼安全冗余
随着L2级智能驾驶进入普及阶段,L3/L4级赛道正在成为各家车企的下一个竞争焦点。背后的最大难题,就是如何在成本可控的前提下,保证足够的安全。 高工智能汽车研究院监测数据显示,2022年度中国市场(不含进出口ÿ…...
Echarts 每个柱子一种渐变色的象形柱状图
第023个点击查看专栏目录本示例是解决每个柱状图的每一个柱子都呈现一种渐变色,每个柱子的颜色都不同。这里同时采用了象形的柱状图效果。 文章目录示例效果示例源代码(共125行)相关资料参考专栏介绍示例效果 示例源代码(共125行&…...
叠氮试剂79598-53-1,6-Azidohexanoic Acid,6-叠氮基己酸,末端羧酸可与伯胺基反应
●中文名:6-叠氮基己酸●英文名:6-Azidohexanoic Acid,6-Azidohexanoic COOH●外观以及性质:西安凯新生物科技有限公司供应的6-Azidohexanoic Acid浅黄色或者无色油状,叠氮化物可使用铜催化的Click化学与末端炔烃共轭&…...
Nginx网站服务——编译安装、基于授权和客户端访问控制
文章目录一、Nginx概述1.1、Nginx的特点1.2、Nginx编译安装1.3、Nginx运行控制1.4、Nginx和Apache的区别二、编译安装Nginx服务的操作步骤2.1、关闭防火墙,将安装nginx所需软件包传到/opt目录下2.2、安装依赖包2.3、创建运行用户、组(Nginx 服务程序默认…...
Spring Boot 版本升级2.2.11.RELEASE至2.7.4
2.2.11.RELEASE > 2.7.4项目更新spring-boot-starter-parent 主依赖,导致项目跑不起了日志也没有输出有用信息,自己查看源码调试启动入口打断点,一步步进入方法定位项目停止代码我的项目执行到SpringApplication.class 的152行代码会停止项…...
OpenShift 4 - 使用辅助安装器安装单节点 OpenShift
文章目录单节点 OpenShift 和 OpenShift 辅助安装器单节点 OpenShiftOpenShift 辅助安装器使用辅助安装器安装单节点 OpenShift本文使用的安装环境准备环境在宿主机上安装 KVM 环境创建 SSH 证书根据集群配置,用辅助安装器生成 Discovery ISO用 Discovery ISO 启动 …...
Allegro如何快速锁定整板测试点操作指导
Allegro如何快速锁定整板测试点操作指导 在做PCB设计的时候,会需要给整板添加测试点,用于飞针测试,如下图 在测试点添加好之后,文件输出之前需要把测试点全部锁定,避免因为测试点模具开好,测试点被移动的情况出现 如果逐个锁定Via,容易遗漏 Allegro支持快速锁定整板测…...
系统分析师---知识产权标准化思维导图
保护范围以及对象(3星) 著作权法:不用申请,作品完整即保护绘画摄影作品,原件持有人只是所有权与展览权,著作权归原作者 专利法:专利权需要申请商标法:商标权需要申请反不正当竞争法…...
HiEV洞察 | 特斯拉HW4.0再爆猛料,高精定位、雷达均有变动
作者 | 查理斯 编辑 | 王博特斯拉 HW4.0 消息传出后,有人爆料说在硬件层面发生了巨大变化,引发行业轰动。大家都在猜测HW4.0 具体做了哪些改动。 2月16日,Twitter用户greentheonly爆出HW4.0的主板拆解照片。2月18日又爆出毫米波雷达的拆解照片…...
潜伏的 Linux Rootkit:Syslogk
Rootkit 是非常危险的恶意软件,一旦侵入就很难被发现。开发 Rootkit 通常更加困难,很多攻击者都倾向于重用开源项目。 Adore-Ng 是一个相对较老的、开源的 Linux 内核 Rootkit,最初针对内核 2.x 版本开发,但目前已更新为针对内核…...
JVM总结
1. 内存结构 线程私有区 程序计算器 作用:是一块较小的内存空间,存储的是当前线程所执行的字节码文件的序号特点:线程私有,不会出现内存空间溢出 虚拟机栈 虚拟机栈是管理JAVA方法执行的内存模型,每个方法执行时都…...
AOF:redis宕机,如何避免数据丢失
由于redis是基于内存的数据库,一旦宕机,数据就会丢失?如何解决? 目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB(Redis DataBase) 快照。 AO…...
LC-3—MIO、MMIO、Caller Save、Callee Save
LC-3—MMIO、Caller Save、Callee SaveMMIOCaller Save、Callee Save举个例子MMIO MMIO(Memory Mapped I/O)是一种在系统内存中映射I/O端口的技术,它允许设备直接访问内存中的特定地址,从而实现I/O操作。MMIO技术可以提高I/O操作…...
SQL注入报错注入之floor()报错注入原理分析
简介 对于SQL注入的报错注入通常有三个函数需要我们掌握: extractValue(xml_frag, xpath_expr)updateXML(xml_target, xpath_expr,new_xml)floor() 对于extractValue和updateXML函数来说比较好理解,就不做解释了,这里只对floor函数的报错注…...
2023CS双非保研985经验分享(南大、华科、中科大科学岛、国防科大、西交、中南、深圳大学、北邮、中科院等)
前言: 2022保研以来,因为自己的双非背景,要与985、211的排名靠前的计科大佬竞争,不自信、焦虑无时无刻的包围着我;所幸,一路以受到了许多学长、学姐耐心的帮助,也有很多保研的同学一路互相支撑。…...
Shell中的IFS
IFS是shell的内置变量,IFS是一个字符串,里面的每一个字符都会用来作为分隔符进行单词分割。 IFS变量只在当前shell起作用。 一、对$*的影响 先做参数替换把$*替换成参数列表。相当于args[] 然后下面分两种情况: (1)…...
Java学习线路图--书籍推荐
----基础---- 《Java从入门到精通》 ----进阶---- 一 《Java项目开发全程实录》《Java开发实例大全(基础篇)》《Java开发实例大全(提高篇)》 二 《Java Web从入门到精通》《Java Web项目开发全程实录》《Java Web开发实例大…...
【GO】k8s 管理系统项目23[前端部分–工作负载-Pod]
k8s 管理系统项目[前端部分–工作负载-Deployment] 1. 代码部分 1.1 准备工作 由于Pod页面和Deployment内容差不多.那么就直接把Deployment的内容复制过来.再做修改. 替换Deployment为Pod替换Deploy为Pod替换deployment为pod替换deploy为pod禁用新增的按钮,删除新增方法,表…...
rabbitmq在linux系统下安装步骤
第一步:登录官网 官网地址:www.rabbitmq.com,点击Get Started 重要信息:RabbitMQ Tutorials手册,描述了工作模式 第二步:点击Download Installation下载 重要信息:rabbitmq是用erlang语言开发的࿰…...
阿里测试员晒薪资条,看完真的扎心了...
前几天,有位老粉私信我,说看到某95后学弟晒出阿里的工资单,他是真酸了…想狠补下技术,努力冲一把大厂。 为了帮到他,也为了大家能在最短的时间内做面试复习,我把软件测试面试系列都汇总在这一篇文章了。 …...
内网渗透辅助工具集Yasso
目录 介绍 工具优势 程序功能模块 目前已有用功能模块 使用例子 工具下载</...
Spring笔记(1):概述
1、什么是Spring? Spring是最受欢迎的企业级Java应用程序开发框架,使用它创建性能好、易于测试、可重用的代码。Spring是一种轻量级的框架。Spring框架的核心特性是开发任何Java应用程序,其目标是使得J2EE开发变得更容易,通过启用…...
工程机械焊接件焊接结构件三维扫描检测外观质量控制-CASAIM三维扫描检测仪
焊接已发展为制造业中的一种重要的加工方法,广泛应用于航空、航天、冶金、石油、汽车制造以及国防等领域。工程机械焊接件品种繁多、几何形状复杂,焊接件质量的好坏将直接影响到产品的使用寿命长短。对焊缝表面尺寸测量及评定表面焊缝缺陷时,…...
使用linux部署项目步骤
文章目录前言一、服务器环境配置二、数据库导入三、项目打包1、修改项目中的访问路径2、修改db.properties的数据库访问路径3、打包4、修改配置,启动服务四、测试总结前言 今天学习了在服务器中部署项目,记录一下 一、服务器环境配置 首先要安装VMware&…...
pt02-list-tuple-dir
容器类型 通用操作 数学运算符 (1) 用于拼接两个容器 (2) 用原容器与右侧容器拼接,并重新绑定变量 (3) * 重复生成容器元素 (4) * 用原容器生成重复元素, 并重新绑定变量 (5) !:依次比较两个容器中元素,一但不同则返回比较结果。< < > > 意…...
高端电器新十年,求解「竞速突围」
竞争激烈的高端电器品牌们,平时王不见王,但也有例外。海尔、博西、海信、创维、方太、老板等等近乎中国电器行业所有一线品牌副总裁级别以上高层,2月22日都现身于上海,来参加一场由红星美凯龙攒起来的高端电器局,2023中…...
[Android Studio] Android Studio使用keytool工具读取Debug 调试版数字证书以及release 发布版数字证书
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…...
2023年金三银四必备软件测试常见面试题1500问!!!【测试思维篇】
五、测试思维5.1 打电话功能怎么去测?我们会从几个方面去测试:界面、功能、兼容性、易用性、安全、性能、异常。1)界面我们会测试下是否跟界面原型图一致,考虑浏览器不同显示比例,屏幕分辨率。2)功能&#…...
推荐四款自用的电脑神器
作为一个经常鼓捣电脑的小编来说,无论是写文章、截图、办公方面都缺少不了一些好用的软件,今天就给大家盘点一些我推荐用的办公效率工具,让你的效率事半功倍。 写文章神器 以前写文章一直是在公众号编辑上直接写的,缺点就是格式有…...
东莞高端做网站公司/爱站seo
直线AB与北方向的夹角,按顺时针方向算 坐标北方向起顺时针与某一方向夹角...
网站下载视频方法/网络推广费用
首先,raw的意思就是「未经加工的,生的」。 python 2.x 中: raw_input() 和 input() 这两个内建函数都可以读取用户的输入来实现交互的目的,但二者存在差别。 raw_input(): 顾名思义,不管用户输入的是字符还是数字&…...
自己怎么做卖服装的网站/网站营销网
在项目中经常会用到整目录复制的功能,windows的API只能支持到单文件的copy,自己写了一个: BOOL CopyFiles(CString szSrcDir, CString szDestDir, BOOL bfailIfExists) {CFileFind finder;if (!PathIsDirectory(szSrcDir)){return FALSE;}BOOL bExists …...
做网站费用上海/百度打开百度搜索
在Tableadapter里面用%x%,应该是不行的,经过了测试, 有两种解决办法, 1种是:通过存储过程,参见: http://forums.asp.net/t/1390313.aspx 1种是通过类似,WHERE CharIndex(x, book_inf…...
返利网站怎么做的/百度售后电话人工服务
1.首先要明确你是基于SpringBoot 操作nacos 还是基于Spring Cloud 操作Nacos 这是 Naocs 的官网 Open API 指南 (nacos.io) 2.如果基于Spring Cloud操作一定注意要在bootstrap.yml 配置不要在application.yml配置nacos信息,如下图所示,不然会失败&#…...
接网站开发的公司/seo推广培训学费
一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件、Web、文件存储、数据库等服务。也有非常多的公司在企业内部网中利用Linux服务器提供这些服务。随着人们对Linux服务器依赖的加深,对其可靠性、负载能力和计算能力也倍加关注。Linux集…...