1、@Override注解
用于重写父类的方法 或者是写接口实现类时用到该注解。
2、@Deprecated注解
用于表示该方法是一个过期的方法。
3、 @suppressWarnings注解
表示该方法在编译时自动忽略警告。
1、@Component 组件,没有明确的角色
2、@Service 在业务逻辑层(service层)使用
3、@Repository 在数据访问层(dao层)使用
4、@Controller 在controller控制层使用
5、@Autowired 自动装配(默认根据类型注入,可直接在字段属性上或set方法上使用)
6、@Value 注入SpEL表达式
7、@Qualifier 限定描述符一般与@Autowired配合使用可找到唯一的一个bean对象
@Target(ElementType.TYPE) //说明注解的作用范围,type指的是作用于类、接口或者枚举
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期,保留到class文件中(三个生命周期)
@Documented // 表明这个注解应该被javadoc记录
@Inherited // 子类可以继承该注解
@SpringBootConfiguration // 继承了Configuration,表示当前是注解类
@EnableAutoConfiguration // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan(excludeFilters = { // 扫描路径设置(具体使用待确认)
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation,其他三个注解只是对整合注解的作用范围及类型做了说明:
@SpringBootConfiguration(点开查看发现里面还是应用了@Configuration)
@EnableAutoConfiguration
@ComponentScan
所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
{"com.startdt.sgminiprogram", "com.startdt.startgo.common.bizcenter"}
)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
每次写着三个类比较冗余所以直接用一个类进行整合;
@Configuration该注解并不陌生,从字面意思我们就得知该注解是对配置的进行声明的注解模式,像以前在ssm框架的时候,经常会通过spring-mvc.xml文件对类的加载器及声明做相关配置,开始只是对单个类进行声明,但是总体来说比较麻烦,然后就通过scan所在类的java进行扫面加载Bean,但是在出现spring boot框架之后对该内容的封装,可以直接通过@Configuration+@Bean注解的方式对你需要初始化并加载到spring的IOC容器当中,方法名是该bean定义的id;
具体表达形式如下:
在ssm层面的xml配置的关系如下:
而基于注解的表现形式是下面这样子的:
@Configuration
public class MybatisConfig{
//bean定义
@Bean
public ...
}
@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository还有@Service的一些类的加载等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
两个比较重要的注解:
@AutoConfigurationPackage:自动配置包
@Import: 导入自动配置的组件
AutoConfigurationPackage注解:
@Order(Ordered.HIGHEST_PRECEDENCE)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
其实register(registry, new PackageImport(metadata).getPackageName())这个方法获取的是启动类下的同级包名及其所有子集包名,
此处返回的是com.startdt.sgminiprogram下的包下的所有包及子集包,所以application启动类一般都放在工程的最高层同一级,从而可以读到所有的类的加载;