spring 注解开发
- @SpringBootApplication:包含了
- @ComponentScan
- @Configuration
- @EnableAutoConfiguration注解
- 其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
exclude | class 数组 | {} | 指定排除哪些类 |
excludeName | string 数组 | {} | 指定哪些名字的bean被排除 |
basePackages | string 数组 | {} | 指定扫描哪些包下面的class |
basePackageClasses | class 数组 | {} | 指定扫描包里面的指定类进行加载 |
- @Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | “” | 代表该配置类注入容器中的名字,如果为 ""的话则为类名字且第一个字母小写 |
- @EnableAutoConfiguration 自动配置。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
exclude | class数组 | {} | 排除哪些类不扫描 |
excludeName | string 数组 | {} | 指定哪些名字为指定的名字的bean不被注入 |
- @ComponentScan 组件扫描,可自动发现和装配一些Bean。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | basePackages | 默认扫描启动类下面的所有组件bean |
basePackages | string | basePackages | 默认扫描启动类下面的所有组件bean |
basePackageClasses | class 数组 | {} | {@link #basePackages}的类型安全替代方案,用于指定包扫描带注释的组件。 将扫描指定的每个类的包。 考虑在每个包中创建一个特殊的无操作标记类或接口 |
nameGenerator | BeanNameGenerator 接口实现类 | BeanNameGenerator | {@link BeanNameGenerator}类,用于命名检测到的组件在Spring容器内。 |
scopeResolver | ScopeMetadataResolver接口实现类 | AnnotationScopeMetadataResolver.class | {@link ScopeMetadataResolver}用于解析检测到的组件的范围。 |
resourcePattern | string | ××/×.class | 正则表达式确定扫描的类 |
useDefaultFilters | boolean | true | 是否使用默认的过滤器扫描bean |
includeFilters | Filter注解 | {} | 指定使用哪些类,可以自定义注解并引用该参数引入到spring的扫描中,然后注入容器中 |
excludeFilters | Filter注解 | {} | 指定排除哪些类,用于指定如何排除bean的规则 |
lazyInit | boolean | false | 是否启动懒加载 |
- @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | “” | 该bean组件的名字 |
- @Slf4j 日志注解
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
topic | 日志类型 | “” | 设置构造的Logger的类别。 默认情况下,它将使用放置注释的类型。 |
- @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | “” | 该bean组件的名字 |
- @Autowired自动导入,按类型装配。默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
注意事项:
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
required | boolean | true | 是否必须注入到容器中,如果未false则入股没有注入到容器中并不报错,否则报错 |
- @Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
name | string | “” | 资源的JNDI名称。 对于字段注释,默认为字段名称。 对于方法注释,默认值是JavaBeans属性名称对应方法。 对于类注释,没有默认值并且必须指定。 |
lookup | string | “” | 引用指向的资源的名称。 它可以使用全局JNDI名称链接到任何兼容资源。 |
type | class | java.lang.Object.class | 资源的Java类型。 对于字段注释,默认值是字段的类型。 对于方法注释,缺省值是JavaBeans属性的类型。对于类注释,没有默认值,这必须是指定。 |
authenticationType | AuthenticationType | AuthenticationType.CONTAINER; | 用于此资源的身份验证类型。这可以为表示a的资源指定任何支持类型的连接工厂,必须不为其他类型的资源指定。 |
shareable | boolean | true | 指示是否可以在此组件与其他组件之间共享此资源。可以为表示任何受支持类型的连接工厂的资源指定此资源,并且不得为其他类型的资源指定此资源。 |
mappedName | String | “” | 此资源应映射到的产品特定名称。 |
description | string | “” | 描述该资源 |
- @PathVariable获取参数。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value/name | string | “” | 在请求url路径中获取数据,且在映射路径中可以使用正则表达式验证参数值是否符合要求 |
required | boolean | true | 是否必须有这个参数值 |
-
@JsonBackReference解决嵌套外链问题。
-
@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)
-
@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入
-
@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。
-
@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。
-
@Bean 用于注入一个bean
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
name/value | string | “” | 注入bean的名字,如果是默认值则为注入时方法的名字 |
autowire | Autowire | Autowire.NO | 是否通过名称或类型通过基于约定的自动装配注入依赖项,请注意,此自动装配模式仅基于外部驱动的自动装配按照约定在bean属性setter方法上,类似于XML bean定义。默认模式允许注释驱动的自动装配。 “不”是指仅外部驱动自动装配,不影响任何自动装配要求bean类本身通过注释表达 |
initMethod | String | ”“ | 初始化期间在bean实例上调用的方法的可选名称。不常用,因为可以直接以编程方式调用该方法在Bean注释方法的主体内。默认值为{@code“”},表示不调用init方法。 |
destroyMethod | string | “” | 关闭时调用bean实例的方法的可选名称 |
-
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
- 参考url: https://blog.youkuaiyun.com/xcy1193068639/article/details/81491071
- 派生类为:
- @ConditionalOnMissingBean
- @ConditionalOnNotWebApplication
- @ConditionalOnProperty
- @ConditionalOnBean
- @ConditionalOnClass
- @ConditionalOnCloudPlatform(value = CloudPlatform.CLOUD_FOUNDRY)
- @ConditionalOnJava(value = ConditionalOnJava.JavaVersion.EIGHT)
- @ConditionalOnJndi
- @ConditionalOnResource
- @ConditionalOnEnabledResourceChain
- @ConditionalOnWebApplication
-
@Scope:注解在类上,描述spring容器如何创建Bean实例。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value/scopeName | string | “” | singleton: 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例,prototype:表示每次获得bean都会生成一个新的对象,request:表示在一次http请求内有效(只适用于web应用),session:表示在一个用户会话内有效(只适用于web应用),globalSession:表示在全局会话内有效(只适用于web应用) |
proxyMode | ScopedProxyMode | ScopedProxyMode.DEFAULT | 指定是否应将组件配置为范围代理,如果是,则代理应该是基于接口还是基于子类,默认为{@link ScopedProxyMode#DEFAULT},通常表示除非有不同的默认值,否则不应创建范围代理 |
- @Value 注解在变量上,从配置文件中读取,读取是由加载顺序的,如果为空请判断是否该bean加载是否提前了
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | 无默认,必填 | 在配置文件中的位置 |
- @ConfigurationProperties 赋值,将注解转换成对象。给对象赋值。
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
prefix/value | string | “” | 在配置文件中的位置 |
ignoreInvalidFields | boolean | false | 标记表示绑定到此对象时应忽略无效字段。 |
ignoreNestedProperties | boolean | false | 标记表示绑定到此对象的字段中包含句点 名称应该被忽略 |
ignoreUnknownFields | boolean | true | 标记表示绑定到此对象时应忽略未知字段。未知字段可能是属性中出错的标志。 |
exceptionIfInvalid | boolean | true | 标记表示如果可以使用Validator,则应引发异常,该类使用{@link Validated @Validated}注释,验证失败。 如果它设置为false,将吞下验证错误。 他们将被记录,但是不传播给调用者 |
- @JsonView json工具类
使用方法
@Data
public class User {
public interface SimpleUser{}
public interface DetailUser extends SimpleUser{}
@JsonView(value = SimpleUser.class)
private Integer age;
@JsonView(value = SimpleUser.class)
@JsonBackReference
private String name;
@JsonView(value = DetailUser.class)
private String password;
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setAge(10);
user.setName("zhangpei");
user.setPassword("dfafafafas");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
objectMapper.writerWithView(User.DetailUser.class).writeValue(bos, user);
System.out.println(bos.toString());
bos.reset();
objectMapper.writerWithView(User.SimpleUser.class).writeValue(bos, user);
System.out.println(bos.toString());
}
}
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | class数组 | {} | 指定该json属于哪个类 |
- @RestControllerAdvice rest服务中controller异常处理方法类
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
basePackages/value | string 数组 | {} | 扫描的基础包 |
- @GuardedBy(value = “lock”) 对象被哪个锁保护着需要同步,只是一个标识
注解参数 | 参数类型 | 注解参数默认值 | 注解参数意义 |
---|
value | string | 必填 | 1. @GuardedBy( “this” ) 受对象内部锁保护 @GuardedBy( “fieldName” ) 受 与fieldName引用相关联的锁 保护 2. @GuardedBy( “ClassName.fieldName” ) 受 一个类的静态field的锁 保存 3. @GuardedBy( “methodName()” ) 锁对象是 methodName() 方法的返值,受这个锁保护。 4. @GuardedBy( “ClassName.class” ) 受 ClassName类的直接锁对象保护。而不是这个类的某个 |
- @FrameworkEndpoint @Controller的同义词,但仅用于框架提供的端点(因此它永远不会与用@Controller定义的用户自己的端点冲突)。