注解
- 使用注解主要是可以带有一些元数据信息,注解本身没有任何的处理。他的处理逻辑是需要其他的一些代码作为配合。
- 有四个元注解是用来定义注解的。(@Document/@Inherited/@Target/@Retetion 元注解参考文章)
- A注解上的其他注解B,若C上注入A,则B的功能也会激活。(应该是spring中大多数注解的机制,即为复合注解)。
- 组合注解,A/B两个基础注解,新增一个注解C,并在C中通过@aliasFor指定关联其他注解的属性,其他注解的对应属性也都会有值,spring 对注解的增强(spring注解@AliasFor的使用)
- 可以通过反射机制获取注解信息
Spring boot注解
-
import
import注解会把类或者配置类的对象交由spring io容器接管。 -
spring 功能激活模式
- 通过注解+切面自动激活:切面指定注解声明的对象(方法)为切入点,激活对应功能。
- 通过启动注解激活功能(Enable*):注解定义时,导入某个类到spring容器,该类带有一些初始化或者切面功能。参考文章 enable*
- Enable注解+import配置bean引入一堆bean
- Enable注解+ import ImportSelector实现类,通过其类的selectImports获取注解信息,并做对应处理。特点:返回的是需要加入ioc容器中的类全限定名
- Enable注解+import ImportBeanDefinitionRegistrar实现类,通过该类获取注解信息,通过beanDefinitionRegistry把类加入到spring容器。特点:加入spring容器的类可以根据注解做一些额外的处理,如根据注解的内容给Bean做赋值处理。参考文章-ImportBeanDefinitionRegistrar接口
- spring.factories机制:
类似于Java spi机制,模块间基于接口实现,接口的实现挪到模块外,对于springboot的实现就是spring.factories,就是在这个配置文件中指定接口的具体实现(有可能会有多个)。该文件中以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key的所有value自动配置类,会被springboot加载,然后按配置类中具体的注解依赖实例化spring bean。
-
spring 属性配置
- @value引入属性:@Value(“${属性名}”)
- @PropertySource读取自定义配置properties 文件
- @ConfigurationProperties读取yml配置形成属性配置bean。在配置类Configuration中声明启用哪个配置用于产生bean,用注解@EnableConfigurationProperties
-
@AliasFor注解目的是为某个注解的属性取别名
spring aliasfor注解参考文章- 同一个注解的多个属性间用,可以把注解默认属性value重命名
- 复合注解中使用,这样新定义的复合注解在继承注解的功能时,还可以把注解的属性在服务注解里重命名,形成统一的注解
- 同一个注解的多个属性间用,可以把注解默认属性value重命名
spring 切面(aop)
spring aspectJ 切入点语法(12种)
- 核心概念:切面、连接点、切入点、目标对象(target)、代理对象(proxy)、切面框架(aspectJ)
- spring 集成aspectj切面的常用注解:@aspect、@Pointcut、@Before、@Around、@After、@AfterRunning、@AfterThrowing
1.创建一个类,使用@Aspect标注
2.@Aspect标注的类中,通过@Pointcut定义切入点
3.@Aspect标注的类中,通过AspectJ提供的一些通知相关的注解定义通知
4.使用AspectJProxyFactory结合@Ascpect标注的类,来生成代理对象 - 切面表达式语法(10个标签12种用法):
- execution:用于匹配方法执行的连接点
- within:用于匹配指定类型内的方法执行(target.getClass().equals(within表达式中指定的类型x))
- this(x):用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配(x.getClass().isAssignableFrom(proxy.getClass()))
- target(x):用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配(x.getClass().isAssignableFrom(target.getClass());)
- args:用于匹配当前执行的方法传入的参数为指定类型的执行方法(args会在调用的过程中对参数实际的类型进行匹配,比较耗时,慎用)
- @within:用于匹配所以持有指定注解类型内的方法(被调用的目标方法Method对象.getDeclaringClass().getAnnotation(within中指定的注解类型) != null)
- @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解(target.class.getAnnotation(指定的注解类型) != null)
- @args:用于匹配当前执行的方法传入的参数持有指定注解的执行
- @annotation:用于匹配当前执行方法持有指定注解的方法
- bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法
- reference pointcut:引用其他切面表达式
- 组合型的pointcut:使用&&、||、!运算符关联多个切面表达式
spring 切面用法
1. 直接使用aspectJ: 使用@Aspect声明切面(顾问/连接/advisor)类,@Pointcut定义切入点,@Before /@After/@Around 等定义通知,将切入点与切面逻辑绑定。(切入点固定,直接aspectJ切面框架)
@Component