Spring 常用注解
@SpringBootApplication
@SpringBootApplication springBoot启动类注解目的是开启springBooot自动配置=
@Configuration + @EnableAutoConfiguration + @ComponentScan
首先是@SpringBootApplication(自动化装配功能)
点进去源码发现
先来看看每个注解的意思
可以发现它是由众多注解组合而成的,下面具体分析下这里每个注解所起到的作用。
@Target Target通过ElementType来指定注解可使用范围的枚举集合(FIELD/METHOD/PARAMETER…)
@Retention Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:
RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使
@Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中
@Inherited 允许子类继承父类的注解,仅限于类注解有用,对于方法和属性无效。
@SpringBootConfiguration 注解实际上和@Configuration有相同的作用,配备了该注解的类就能够以JavaConfig的方式完成一些配置,可以不再使用XML配置。
@ComponentScan 这个注解完成的是自动扫描的功能,相当于Spring XML配置文件中的:context:component-scan,可使用basePackages属性指定要扫描的包,及扫描的条件。如果不设置则默认扫描@ComponentScan注解所在类的同级类和同级目录下的所有类,所以我们的Spring Boot项目,一般会把入口类放在顶层目录中,这样就能够保证源码目录下的所有类都能够被扫描到。
@EnableAutoConfiguration 这个注解是让Spring Boot的配置能够如此简化的关键性注解。
其实主要重要的注解就是标红的这三个注解:下面我们着重分析这三个注解。
1)@ComponentScan:就像上面所说,ComponentScan一般在spring中主要是用于:
@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里,会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等,其作用等同于<context:component-scan base-package=“com.maple.learn” />配置。
而在springboot中,如果你的其他包都在使用了@SpringBootApplication注解的main app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了,如果你有一些bean所在的包,不在main app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包。(后面在解释在这里的原理)
它其实是注册了一个Bean的定义。
new PackageImport(metadata).getPackageName(),它其实返回了当前主程序类的 同级以及子级 的包组件。
以上图为例,DemoApplication是和demo包同级,但是demo2这个类是DemoApplication的父级,和example包同级
也就是说,DemoApplication启动加载的Bean中,并不会加载demo2,这也就是为什么,我们要把DemoApplication放在项目的最高级中。
这里来谈谈其与componentScan的区别:
在默认的情况下就是将:主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。
看完这句话,会不会觉得,这不就是ComponentScan的功能吗?这俩不就重复了吗?
看看文档的这句话:
it will be used when scanning for code @Entity classes.
It is generally recommended that you place EnableAutoConfiguration (if you’re
not using @SpringBootApplication) in a root package so that all sub-packages
and classes can be searched.
比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由@AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/@Service/@Component/@Repository这些注解是由ComponentScan来扫描并加载的。
简单理解:这二者扫描的对象是不一样的。
4)下面来看看一个重中之重的注解:@EnableAutoConfiguration
老规矩进行这个重要注解之前,要先铺垫一些其用到的知识,不然的话,不能到时候懵懵懂懂的。接下来看看这个@Import这个注解,他是来干什么的呢?
@Import注释,根据字义,我们可以理解为导入组件选择器自动配置,作用是将需要导入的组件以全类名的方式返回,这些组件将被添加到Spring容器中,如图:
自动配置类的作用,配置注入功能组件自动完成。
a.允许使用@Configuration注解的类
这个比较简单,如果明确知道需要引入哪个配置类,直接引入就可以。
b.允许是实现ImportSelector接口的类
如果并不确定引入哪个配置类,需要根据@Import注解所标识的类或者另一个注解(通常是注解)里的定义信息选择配置类的话,用这种方式。
c.Spring会把实现ImportSelector接口的类中的SelectImport方法返回的值注入到Spring容器中(即IOC容器)。这个方法的返回值必须是一个class的全类名的String[]。
比较典型的注解:
好吧,简单了解这个之后,下面来谈谈重点吧:
@EnableAutoConfiguration刚才已经贴了一张图了,点开源码之后就是
一路点下去,发现AutoConfigurationImportSelector实现了父类接口ImportSelector,并且重写了父类的selectImports的方法。 在这个方法中,其实主要实现是看configurations这个里面返回的是什么东西就行了。
这个时候,我们就豁然开朗了,原来最终我们是要找“META-INF/spring.factories”这个配置文件啊!
但是这个东西实在哪里呢,来看看我们引入的mavenjar包吧。
是不是明白了,***AutoConfiguration,这个不就是我们上面的注解的形式吗?
上图里面这么多的xxxAutoConfiguration就是我们的这么久得出的结果,最终就是加载这么多的类的全路径,然后springboot内部就是实例化这些类并加载到容器里面,完成springboot应用启动时的自动配置。
原文链接:https://www.cnblogs.com/clover-forever/p/12521386.html -------CSDN博主「CloverLucky」
@component
1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的)
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
@MapperScan
@Mapper注解:
作用:在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
添加位置:接口类上面
@Mapper
public interface UserDAO {
//代码
}
如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:是在Springboot启动类上面添加,
@SpringBootApplication
@MapperScan("com.winter.dao")
public class SpringbootMybatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisDemoApplication.class, args);
}
}
添加@MapperScan(“com.winter.dao”)注解以后,com.winter.dao包下面的接口类,在编译之后都会生成相应的实现类
@selectProvider
@SelectProvider(type=xxxx.class,method=”xxxx”)
属性详解:
type 属性用于指定获取sql语句的指定类
method 属性用于指定类中要执行获取sql语句的方法
@SelectProvider(type=BaseUserProvider.class,method="selectUserById")
public BaseUser selectById(@Param(value="id")Integer id);