1.springboot的优点:
快速搭建开发框架;简化配置(避免spring各种xml文件配置,springboot通过javaConfig的方式对spring进行配置);简化maven依赖(提供一系列的starter 来简化pom文件的配置);内嵌tomcat容器;
javaConfig替代xml配置:
编写pojo类型:@component 注解表示被spring ioc容器进行托管;
@Component public class User { @Value("欣宝") private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + '}'; } }
编写javaConfig类: 添加@configuration注解,使其成为javaConfig类,功能跟xml文件一样,@Bean的功能表示这个方法注册的就是bean,方法名为xml文件中的id,方法返回值为该类的对象;
@Configuration public class MyConfig { @Bean public User getUser(){ return new User(); } }
2.springBoot的自动装配:
springboot的启动类:
启动类上有@SpringBootApplication,在@SpringBootApplication中有一个@EnableAutoConfiguration(开启自动配置)的注解,在@EnableAutoConfiguration中有用@import注解导入组件AutoConfigurationImportSelectors.class,该组件中有selectImports方法,该方法会读取spring-boot-autoConfigure jar包下的meta-info/spring.factories文件,查询key为EnableAutoConfiguration的集合,
并不是将这些配置类全部加载,这些配置类中都有@ConditionalOnXXX注解,通过这个注解判断,满足注解条件的类才会被加载;
将需要导入的组件以全类名的方式返回,这些组件就被添加到组件中;
简要概括一下自动装备:
启动类中有一个@SpringBootApplication注解,包含了@EnableAutoConfiguration代表开启自动
装配,@EnableAutoConfiguration注解会去spring-boot-autoconfigure工程下寻找 META-
INF/spring.factories 文件,这个文件中列举了所有自动装备类的清单,有一百多个,然后自动读取里
面的自动装配配置类清单。
但是这些类不会全部加载,很显然这样非常不合理。但是因为有@ConditionalOn
条件注解,满足
一定条件配置才会生效 如: @ConditionalOnClass(某类.class) 工程中必须包含一些相关的类时,
配置才会生效。所以说当我们的起步依赖中引入了一些对应的类之后,自动装备的条件满足了,自
动装备才会被触发。
3.springBoot的自定义注解:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
自定义注解类编写的一些规则:
1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
2. 参数成员只能用public或默认(default)这两个访问权修饰
3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
5. 注解也可以没有定义成员, 不过这样注解就没啥用了
@Retention 注解
功能:指明修饰的注解的生存周期,即会保留到哪个阶段。
RetentionPolicy的取值包含以下三种:
SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
@Target 注解
功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。
ElementType的取值包含以下几种:
TYPE:类,接口或者枚举
FIELD:域,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包