SpringBoot框架05-特性及常用注解

“约定优于配置”的理念。

  SpringBoot 是Spring 社区发布的一个开源项目,用来简化新 Spring 应用的初始搭建以及开发过程的。是Spring组件一站式解决方案,主要是简化了使用Spring 的难度,节省了繁重的配置,提供了各种启动器。

特性
  1. 独立运行的Spring项目;可以以jar 包形式独立运行,java -jar xx.jar。
  2. 内嵌servlet容器;SpringBoot 可选择内嵌Tomcat,Jetty或Undertow,无须以war包形式部署项目。
  3. 提供starter起始依赖简化了maven的配置
  4. 自动装配Bean;SpringBoot 会根据再类路径中的jar包、类,为jar包里面的类自动配置Bean。
  5. 准生产的应用监控;比如安全、指标、健康检查等。基于http、ssh、telnet对运行时的项目进行监控。
  6. 无代码生成和无需xml配置;SpringBoot 通过条件注解来实现。
优点
  1. 快速构建项目;
  2. 对主流开发框架的无配置集成;
  3. 项目可独立运行,无须外部依赖Servlet容器;
  4. 提供运行时的应用监控;
  5. 极大地提高了开发、部署效率(自动化部署);
  6. 与云计算的天然集成。
缺点
  1. 由于不熟悉底层的原理和配置,报错时比较难定位;
  2. 缺少服务注册发现,外围监控等外围集成方案;
  3. 缺少REST落地的URI规划方案。
自动装配

        

  1. 获取传入的工厂类名、类加载器;
  2. 通过类加载器,获取指定的META-INF/spring.factories文件;
  3. 获取文件中工厂类的全限定类名路径
  4. 通过类路径反射得到工厂的class对象、构造方法;
  5. 生成工厂类实例返回。实例化为对应标注了@Configuration 的JavaConfig 形式的配置类,然后汇总并将其都加载到IOC容器中。
SpringFactoriesLoader.loadFactoryNames(type, classLoader);

//第一步
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}

//第二步
private static Map<String, List<String>> loadSpringFactories(
    @Nullable ClassLoader classLoader) 
{
    MultiValueMap<String, String> result 
                         = (MultiValueMap)cache.get(classLoader);
if (result != null) {
return result;
    } else {
try {
// 根据spring.factories 文件中类的全路径类名,加载类进来
            Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
           ....
        }
            cache.put(classLoader, result);
return result;
        } catch (IOException var13) {
throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
        }
    }
}

// 第三步,实例化对象,并加载到容器中
private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args, Set<String> names) {
    List<T> instances = new ArrayList(names.size());
    Iterator var7 = names.iterator();

while(var7.hasNext()) {
String name = (String)var7.next();

try {
// 通过反射,实例化对象
Class<?> instanceClass = ClassUtils.forName(name, classLoader);
            Assert.isAssignable(type, instanceClass);
Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);
        T instance = BeanUtils.instantiateClass(constructor, args);
            instances.add(instance);
        } catch (Throwable var12) {
        }
    }

return instances;
}
常用注解
  1. @SpringBootApplication核心注解,应用在主类上。由以下三个注解构成:
    1. @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制;
    2. @ComponentScan
      1. 自动扫描并加载被@Component,@Service,@Controller 注解的Bean,将其加载到IOC 容器中。
      2. 默认是从声明@ComponentScan 所在类的包下进行扫描。也可通过basePackages等属性来指定自动扫描的范围。
    3. @Configuration
      1. 允许在Spring 上下文中注册额外的 Bean 或导入其他配置类。或通过@ImportResource({"classpath:spring/applicationContext.xml"}) 导入外部配置类;
      2. 任何一个标注了@Configuration 的Java类定义的都是一个JavaConfig 配置类。
  2. @ Import
    1. 用于引入其它配置类Bean注解,将配置类Bean注册Spring容器
    2. @Import 注解一般和@Configuration注解一起使用实现原理涉及Spring组件扫描Bean注册依赖注入机制
      1. 组件扫描Spring通过组件扫描机制自动扫描加载带有@Configuration 注解其它指定注解配置类将其识别配置类
      2. 注册配置类一个配置类识别Spring将其注册容器
      3. 处理@Import注解:配置类使用@Import注解Spring解析注解参数根据参数不同类型进行处理
        1. @Import参数其它配置类:Spring会将导入配置类加入容器
        2. @Import的参数是普通类Spring会将该类实例化为一个Bean,并注册到容器中。
        3. @Import的参数是实现了ImportSelector接口的类:Spring会调用ImportSelector接口中的selectImports()方法,根据返回的类名数组将相应的类注册为Bean。@EnablAutoConfiguration 中import引入AutoConfigurationImportSelector.class
      4. selectImports()方法实现功能
        • 获取META-INF/spring.factoriesEnableAutoConfiguration对应Configuration列表
        • @EnableAutoConfiguration注解exclude/excludeName参数过滤
        • 私有内部类ConfigurationClassFilter筛选一遍不满足@Condition配置类
        • ​​​​​​​@Import的参数是实现了ImportBeanDefinitionRegistrar接口的类:Spring会调用ImportBeanDefinitionRegistrar接口的registerBeanDefinitions()方法,通过编程方式注册Bean到容器中。这样,可以通过自定义的逻辑来注册额外的Bean。
  3. @Autowired注解:
    1. byType按类型进行自动注入;但存在多种同类型时,则会抛异常。
    2. 结合@Qualifier注解,指定对应的类名,进行byName 按类名注入。
    3. 当应用在Collection 集合上时,会将所声明类的所有实现类都放在哪个指定的Collection中。如果@Autowired 和Map 集合一起使用,则将它的bean名称作为key,所有的bean 作为value;
      @Autowired
      @Qualifier(name="userDao")
      private UserDao userDao;
      @Autowired
      private Map<String, IStrategy> stg;
  4. @Resource:
    1. 默认是byName 按名称进行自动注入。有两个属性:name 和 type。
    2. 同时指定了name和type, 则从Spring 上下文中找到唯一匹配的Bean 进行装配,找不到则抛出异常。
    3. 指定了name,则从上下文中查找名称(Id)匹配的Bean 进行匹配,找不到则抛出异常;
    4. 指定了type,则从上下文中找到类型匹配的唯一Bean进行装配,找不到或者多个,都会抛出异常。
    5. name和type都没指定,则自动按照byName 方式进行装配;如果没有匹配,则根据byType 方式进行装配。
  5. @Value和@ConfigurationProperties
    1. 读取appliation.yml或配置文件中的参数配置信息;
    2. @ConfigurationProperties 将配置属性与bean 的属性进行绑定。
      @Component
      @ConfigurationProperties(prefix = "前缀")
      class LibraryProperties {
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值