启动注解
@SpringBootApplication
相当于 @Configuration、@EnableAutoConfiguration 、 @ComponentScan 三个的作用
扫描包注解
@ComponentScan
1、工程中Application类的位置。默认情况下就不需要配置@ComponentScan这个注解了。 因为Application类,在启动的时候,默认是加载和Application类所在同一个目录下的所有类,包括所有子目录下的类。所以一般情况下,启动类的位置是有特殊要求的。 必须放在所有包的根目录中。
2、假设写的模块,编译成了jar包,并且上传到了私服。在pom中以第三方包的形式依赖进来。
如果jar包中也存在注解,为了spring boot启动的时候,注解可以被扫描到,需要做的就是
在spring boot启动类中配置上 @ComponentScan注解,并且指定第三方jar包的根路径。
所以一般情况下,公司级的第三包前面的路径名最好一直。比方说 com.pa 这样就不会出现遗漏的情况。
3、还有一个说法是,第三方包中最好不要使用注解,因为注解会带来调用者使用不方便,需要配置扫描注解等。如果遗漏指定包扫描路径,那么就会出bean加载失败的情况。所以我们看到的最基础的第三方jar包,几乎是没有注解的。
@Configuration、@Bean
1、表示这个类是一个spring 配置类,一般这里面会定义Bean,会把这个类中bean加载到spring容器中。
2、2、可以与@Conditional相关的注解联合使用来实现@Configuration修饰类的条件加载
@EnableAutoConfiguration
如果被依赖包中在src/main/resource/META-INF中定义了spring.factories文件,并且在文件中定义了org.springframework.boot.autoconfigure.EnableAutoConfiguration属性,属性内定义了多个完整的类路径。springboot中的自动加载机制就是通过这种方式出现的。
工作原理:https://www.jianshu.com/p/464d04c36fb1
在依赖包中使用了@EnableAutoConfiguration注解,那么该注解就会去他所有pom的依赖项中逐项扫描其内部是否包含该文件,并且会自动加载内部定义的所有类。而springboot自身的所有对象都是通过该种方式来实现创建的。
@ComponentScan和@EnableAutoConfiguration区别
1、对于@Configuration和@Conditional联合定义的类,如果出现了@Configuration类的嵌套,那么外面的@Conditional起作用的范围是不一样的。@EnableAutoConfiguration是都起作用,但是@ComponentScan只对外面的起作用,里面还是照样会执行到,要特别注意。
http://www.cnblogs.com/diegodu/p/7889379.html
范围类注解
@Scope
https://blog.csdn.net/zalan01408980/article/details/82904126
创建bean对象
@Component
无差别的bean对象,下面的注解其实都是在该注解的基础上实现的,用于表示特殊用途的bean对象。
@Controller和@RestController
外部访问请求对象,其中@Controller默认返回的视图,而@RestController默认返回的是字符串。 @RestController是在@Controller基础上定义加上@ResponseBody实现的。
请求相关的注解还有下面这些
@service
表示服务类的bean对象
@repository
表示存储类的bean对象
对象注入
@Resource与@Autowired
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
web请求类
@RequestMapping
该注解通常与@RestController搭配使用,使用该注解可以定义请求路径,既可以指定多个路径,也可以使用通配符定义路径。也可以在路径中使用占位符。也可以限制请求的方式和参数。
https://blog.csdn.net/zalan01408980/article/details/82904126
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
这些注解都是继承了@RequestMapping,限制了指定请求方式的注解。只用于修饰方法。
@FeignClient
springcloud中提供的web请求注解,该注解用于修饰一个接口,可以指定请求的根路径,请求名。与@GetMapping等上面的方法注解搭配使用。只需要定义接口,不用实现就可以发送HTTP客户端请求。
Conditional 条件加载相关类和注解
Condition接口
public interface Condition { boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2); }
Condition是个接口,需要实现matches方法,返回true则注入bean,false则不注入。
https://blog.csdn.net/xcy1193068639/article/details/81491071
@Conditional
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
@Conditional的定义:
//此注解可以标注在类和方法上
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口:
其他条件类注解
Spring框架还提供了很多@Condition给我们用,当然总结用语哪种好理解,看给位读者喽
@ConditionalOnProPerty:定义某个指定参数是否满足设定值,满足就加载,不满足就不加载
https://blog.csdn.net/u010002184/article/details/79353696
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(指定class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在指定名字的bean对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)