SpringBoot中使用到的注解

1.@Configuration

声明当前类是一个配置类(java配置文件), 相当于之前Spring的XML配置文件(), 只不过现在使用基于java的配置, 它允许在上下文中注册额外的bean或导入额外的配置类, Spring的容器会根据它来生成Ioc容器去装配bean.

2.@Bean

注解在方法上, 声明当前方法的返回是一个Bean并装配到Ioc容器中, 其属性name指定Bean在Ioc容器中Bean的名称, 不配置name默认就是方法名.

3.@Component

哪个类被扫描装配进入IoC容器, 例如@Component("user"), user就是Bean的名称, 如果不配置, 则以类名首字母小写其他不变作为Bean的名称.

3.1.@Service

该标准注入了@Component注解, 默认情况下会被Spring扫描装配到Ioc容器.

4.@ComponentScan

自动扫描此注解修饰类所在的当前包和其子包下的所有使用声明Bean(@Component、@Service、@Repository、@Controller)注解的类并注册为Bean.

其属性basePackages可以定义扫描的包名(可定义多个), 如果不定义, 默认扫描当前包和其子包.
属性basePackageClasses定义需要扫描的类.
属性includeFilters和excludeFilters, includeFilters是定义满足过滤器(Filter)条件的Bean才去扫描装配, excludeFilters则是排除过滤器条件的Bean, 他们都是需要一个@Filter去定义, 此注解有一个type类型, 这里可以定义为注解(默认)或正则式等类型等, Filter中的属性classes定义注解类, 属性pattern定义正则式.


扫描chapter3包下的所有Bean, 但是排除掉注解@Service描述的Bean.

5.@Value

@Value就相当于传统xml配置文件中的value字段。默认获取application.properties/yml配置文件中的属性绑定值(@Value("${key}")), 也可以结合其他注解(例如@PropertySource)获取其他properties中的属性值; 如果@Value还可以指定具体的值, 例如使Spring Ioc容器给予对应的属性注入对应的值, 如下:

6.@SpringbootApplication

SpringBoot的核心注解, 主要目的是开启自动配置, @SpringBootApplication注解等价于使用@Configuration、@EnableAutoConfiguration和@ComponentScan的默认属, 关闭特定的配置使用注解中的exclude属性, 例如:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}), 需要特别注意, 它提供的exclude和excludeName两个方法是对于其内部自动配置类才生效的. 为了能够排除其他类, 可以自己加上@ComponentScan注解已达到我们的目的.

7.@Autowired

Spring中最常用的注解之一, 十分重要, 它会根据属性的类型(by type)找到对应的Bean进行注入, 如果类型不唯一(例如接口的多个实现类都注册为Bean, 它们的类型一样), 此时Ioc容器就会抛出异常, 这时可以将注入的属性改为与某个具体实现类Bean的名称对应, 也就是说@Autowired注解首先会根据类型找到对应Bean, 如果对应的Bean不是唯一的, 那么会根据其属性名称和Bean的名称进行匹配, 匹配上就使用此Bean, 匹配不上就抛出异常. 另外需要注意, 此注解是一个默认必须要找到Bean的, 如果不能确定依赖的Bean是否存在(允许依赖的Bean为null), 可以配置注解的属性required为false.
image
如果Animal为接口, 但是只有一个实现类(dog), 这样注入不会报错, 但是如果有多个实现类注册为Bean(dog,cat), 这样注入就会报错, 因为容器不知道要依赖的是哪一个Animal, 此时可以改为如下:
image

8.@Primary

如7中所述, 如果Animal存在多个实现类注册为Bean(dog,cat), 可以把属性animal改为dog或cat(根据类型找不到就根据Bean名称找), 但是这样显然很憋屈, 这样的原因就是一开始根据类型注入失败, 此时可以使用注解@Primary解决, 这是一个修改优先权的注解, 回到刚才的问题, 依赖注入的属性依然是animal(不在改为dog或cat), 当你想依赖cat的时候, 就把dog实现类这个Bean添加一个注解@Primary就可以了, 如下:
image
这里的注解@Primary告诉Ioc容器, 发现多个同类型的Bean时候, 优先使用我(cat)进行注入, 这样animal依赖的就是cat这个Bean了. 但是如果dog和cat都加了@Primary注解, 这时候Ioc容器还是无法区分使用哪个Bean进行注入了, 这就又回到了一开始的问题, 如果同类型的多个Bean使用了@Primary注解, 那么注解@Qualifier可以解决这个问题, 请看9

9.@Qualifier

此注解的value属性需要一个字符串去定义, 此注解与@Autowired结合使用, 通过类型和名称一起找到Bean, 因为Bean名称在Ioc容器中是唯一的标识, 通过这两个注解, 就可以通过类型和名称一起找到Bean了, 回到刚才8中的问题, 如果同类型的多个Bean都使用了@Primary注解, 此时animal依赖的依然不知道是哪一个Bean, 这时候可以在属性animal上继续加注解@Qualifier("dog"), 意思是@Autowired根据类型不知道使用哪个Bean, 就在同类型的基础上, 使用dog作为Bean名称进一步确认Bean(类型+名称), 如下:
image

10.@ConfigurationProperties

如果我们需要取N个配置项, 通过@Valu的方式去配置项需要一个一个去取, 这就显得有点low了, 我们可以使用@ConfigurationProperties, 标有 @ConfigurationProperties的类(使用此注解的类必须被注册可被扫描到或者使用@EnableConfigurationProperties, 推荐前者)的所有属性(属性需要有setter方法才能被注入值)和配置文件中相关的配置项进行绑定(默认从全局配置文件中获取配置值), 将properties属性和一个Bean以及属性相关联, 从而实现类型安全的配置绑定(这个注解要求的配置文件必须是application.properties/yml配置文件), 可以指定属性前缀, 前缀+POJO属性名组成全限定名到配置文件中找相对应的属性值.

11.@PropertySource

加载指定的properties配置文件, 例如:

例如:@PropertySource(value={"classpath:jclbc.properties"} ,ignoreResourceNotFound=true)

ignoreResourceNotFound的默认值为false, 也就是没有找到属性文件就报错, true不报错, value可以配置多个配置文件, 使用classpath前缀, 意味着去类路径下找指定的配置文件.

  1. @PropertySource 可以配合 @Value 和 @ConfigurationProperties 使用。
  2. @PropertySource 和 @Value组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
  3. @PropertySource 和 @ConfigurationProperties组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。

12.@Conditional

此注解需要配合接口Condition(org.springframework.context.annotation)来完成对应的功能. 也就是根据满足某一个特定条件创建一个特定的Bean, 可以用到带有@Bean注解的方法上或者其他的类似@Component之类的注解上, 接口Condition的实现类需要实现matchers方法, 返回true就装配Bean, 反之不装配, 例如:

@Conditional(DefaultDispatcherServletCondition.class)

装配Bean的配置条件是满足类DefaultDispatcherServletCondition的验证, DefaultDispatcherServletCondition类实现了接口Condition, 重写方法matches方法, 方法返回true则装配Bean, 返回false不装配

13.@Scope

描述spring容器中Bean的作用域, 默认是单例的. 其他作用域有 原型, 请求, 会话, 应用. 后三个是在SpringMVA环境中存在的.

14.@Profile

在不同的环境下选择实例化不同的Bean, 也就是对不同环境给提供不同的功能支持, 通过激活, 指定参数等方式快速切换环境. Spring中存在两个参数可以配置以修改启动profile机制, spring.profiles.active和spring.profiles.default, 这俩属性都没配置的话,Spring不会启动profile机制, 意味着@Profile标注的Bean不会被加入到IoC容器,Spring会先判断active配置后再去找default属性, 所以active的优先级大于default

15.@ImportResource

尽管SpringBoot推荐注解和扫描配置Bean, 但它并不拒绝使用XML配置Bean, 换句话说, 我们可以在SpringBoot中使用XML对Bean进行配置, 也就是注解@ImportResource, 通过它可以引入XML文件, 加载Bean.

@ImportResource(value={"classpath:xxx.xml"})

value可以配置多个XML文件

16.@Aspect

声明是一个切面, 使用此注解时, Spring就会知道当前类是一个切面, 然后可以在切面里定义各类的通知 @Before 、@After、@AfterReturning 和@AfterThrowing 等几个注解 以及 切点@PointCut, 连接点等

17.@Order

注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响

... 持续更新中

posted @ 2021-06-16 14:45  KILLNPE  阅读(198)  评论(0编辑  收藏  举报