springboot系列(三)启动类中关键注解作⽤解析
⼀、Springboot:请求⼊⼝
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableScheduling
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1、@SpringBootApplication注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
…
…
}
复合注解:包含@EnableAutoConfiguration、@ComponentScan、@SpringBootConfiguration
a 、@EnableAutoConfiguration:也是复合注解、借助@Import将所有符合⾃动配置条件的bean定义加载到Spring ioc 中。帮助springboot应⽤将所有符合条件的@configuration配置都加载到当前spring ioc。
@Import注解的使⽤。这个注解帮助我们将多个配置⽂件(可能是按功能分,或是按业务分)导⼊到单个主配置中,以避免将所有配置写在⼀个配置中
b、@ComponentScan:主要作⽤扫描当前包及其⼦包下被@Component,@Controller,@Service,@Repository注解标记的类并纳⼊到spring容器中进⾏管理。是以前的<context:component-scan>(以前使⽤在xml中使⽤的标签,⽤来扫描包配置的平⾏⽀持)。可通过
@ComponentScan 的basepackage等属性来指定扫描范围。(@SpringBootApplication(scanBasePackages = "com.ucredit")。如果不指定默认spring框架实现,从声明@ComponentScan所在的类的package进⾏扫描。所以springboot的启动类最好放在root package下。
c、@SpringBootConfiguration:继承⾃@Configuration,⼆者功能也⼀致,标注当前类是配置类,并会将当前类内声明的⼀个或多个以@Bean注解标记的⽅法的实例纳⼊到spring容器中,并且实例名就是⽅法名。@SpringBootConfiguration注解类相当于spring配置bean的xml⽂件。
d、@Configuration
Spring是给予IOC的,在4.0之前的版本,通常都是程序依赖上下⽂xml⽂件来管理bean,尽管有了扫描配置后相对简单,然⽽java配置的⽅式不同于xml,通过注解能够更简单。下⾯我们通过这两种⽅式⽐较下。
xml中bean的定义
<beans>
<bean id="course"class="demo.Course">
<property name="module"ref="module"/>
</bean>
<bean id="module"class="demo.Module">
<property name="assignment"ref="assignment"/>
</bean>实例化bean的三种方式
<bean id="assignment"class="demo.Assignment" />
</beans>
注解配置类
@Configuration
public class AppContext {
@Bean
public Course course() {
Course course = new Course();
course.setModule(module());
return course;
}
@Bean
public Module module() {
Module module = new Module();
module.setAssignment(assignment());
return module;
}
@Bean
public Assignment assignment() {
return new Assignment();
}
}
@Configuration,该注解配置在类上,告知Spring这个类是⼀个拥有bean定义和依赖项的配置类。@Bean注释⽤于定义Bean,该注解位于实例化bean并设置依赖项的⽅法上。⽅法名默认通beanId活默认名称相同,该⽅法返回类型是Spring注册的bean。总体来说就是告诉Spring容器加载这个配置,相对于xml,这个注解就是将*.xml配置进l
e、@Import
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
@Import 与xml配置⽅式下的作⽤⼀样。⽀持导⼊的类型有:
⼀个或多个拥有 @Configuration 注解的配置类
ImportSelector 接⼝的实现类
ImportBeanDefinitionRegistrar 的实现类
1)、如果Import注解中Class为ImportSelector⼦类,通过invokeAwareMethods(selector)设置aware值,如果类型为 DeferredImportSelector 则添加到deferredImportSelectors集合中,待前⾯的parser.parse(configCandidates)
⽅法中processDeferredImportSelectors()处理;如果不是,则执⾏selectImports⽅法,将获取到的结果递归调⽤ processImports,解析selectImports得到的结果
2)、如果Import注解中Class为ImportBeanDefinitionRegistrar⼦类,则添加到importBeanDefinitionRegistrars中,注意该部分的数据在执⾏完parser.parse(configCandidates)后调⽤ader.loadBeanDefinitions(configClasses)解析,否则执⾏配置信息的解析操作。
public interface Car {
public void print();
}
@Component
public class Toyota implements Car {
@Override
public void print() {
/
/ TODO Auto-generated method stub
System.out.println("I am Toyota");
}
}
@Component
public class Volkswagen implements Car {
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("I am Volkswagen");
}
}
@Configuration
public class JavaConfigA {
@Bean(name="volkswagen")
public Car getVolkswagen(){
return new Volkswagen();
}
}
@Configuration
public class JavaConfigB {
@Bean(name="toyota")
public Car getToyota(){
return new Toyota();
}
}
@Configuration
@Import({JavaConfigA.class,JavaConfigB.class})
public class ParentConfig {
//Any other bean definitions
}
public class ContextLoader {
public static void main (String args[]){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ParentConfig.class); Car car = (Bean("toyota");
car.print();
car = (Bean("volkswagen");
car.print();
context.close();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论