zoukankan      html  css  js  c++  java
  • Spring 笔记(三)Bean 装配

    前言

    Spring 有两大核心,也就分成两份笔记分别记录。
    其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring)。

    基于 JavaConfig 的容器配置

    核心概念:@Bean 和 @Configuration

    @Configuration 用于注解类,标明该类为一个 Spring 配置类。

    @Bean 用于注解 method,表示它会返回一个需要由 Spring Container 管理的 Bean 对象。该注解常用于被 @Configuration 注解了的类中,且与 xml 的 标签具有相同的作用。(@Bean 也可用在其他被 @Component 注解了的类中,但是不常用)
    默认情况下,@Bean 注解得到的 bean 的 id 就是被注解的方法的方法名。也可通过@Bean(name="xxx") 来自定义其id.

    开启组件扫描与管理 (@ComponentScan)

    组件扫描 会自动扫描指定的包,为所有 被 @Component 注解了的类创建 Bean.
    通过在配置类上再添加一个注解@ComponentScan(basePackages = "com.acme")

    引入其他配置类 (@Import 和 @ImportResources)

    当配置类变得庞大时,我们可能会想将其拆分成多个配置子类,就会需要向 AnnotationConfigApplicationContext 的构造器传入多个 Class 类型。
    可随着配置类数量的提升,这样也不会是一个好办法。我们希望把多个类似的配置类封装成一个上层配置类,而@Import({Class, ...})就是导入其他配置类的注解。

    @Import 用于导入 JavaConfig 配置类,如果想要导入 xml 配置,应该使用@ImportResources(String),提供的参数是 Resources Path 字符串,用的最多的应该是相对路径或者classpath。

    应用上下文 (AnnotationConfigApplicationContext)

    使用 AnnotationConfigApplicationContext 读取 JavaConfig 配置类,创建应用上下文。

    应用在 Bean 上的注解

    1. @Component 表示该类是一个组件类,Spring 需要创建该类的实例。它是一个通用注解,而下述三个注解都是它的特化。
    2. @Repository:持久层 bean
    3. @Service:服务层 bean
    4. @Controller:控制(MVC)

    bean 的 Scope

    Spring 环境

    Spring 环境由两大部分组成:Profile 和 Properties

    Profile

    设定 Profile:

    通过在 Bean 上添加 @Profile 注解,设定该 Bean 所处的环境。(常分为 development production 两个 profile)

    激活 Profile:

    激活 Profile 依赖于两个独立的属性:spring.profiles.active 和 spring.profiles.default,如果 active 属性被设置了,就优先使用该属性,若该属性没设置,则会使用 default 属性,若 default 仍然没设置,那就只会创建没有 Profile 注解的 Bean.

    有很多种方式可以用于设定 Profile:

    1. 测试环境下,可在测试类上使用 spring-test 模块提供的 @ActiveProfile("development") 激活开发 Profile
    2. 使用JVM的命令行参数:-Dspring.profiles.active="profile1,profile2",顺便可见是能同时激活多个 Profile 的。
    3. @Profile("default") 注解了的 Bean,在没有其他 Bean 被激活的情况下,会被自动激活。(其实就是自动设置了 spring.profiles.default 属性)
    4. 通过 ApplicationEcontext 的 getEnvironment().setActiveProfiles() 方法,激活 Profile。(不过感觉不太好)
    5. servlet context parameters in web.xml,添加如下标签:
    <context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>development</param-value>
    </context-param>
    
    1. 其他

    Properties

    Properties

    一般在配置类上使用 @PropertySource 注解来自动读取属性文件。再使用属性占位符(${...})的方式来使用属性值。
    属性占位符可以用在配置类中、xml 配置中、Bean Class 定义中。
    如果需要使用 属性做为 构造器/工厂函数 的参数,可使用 @Value("${ ... }") 来注入属性值。

    使用属性占位符,需要配置一个 PropertySourcesPlaceholderConfigurer bean,有了这个 bean 才能将占位符解析为环境中的属性。

    Scope

    Spring 在默认情况下,所有的 Bean 都是单例的(Singleton)。但有时也可能会需要用到非单例模式。
    Spring 提供了以下几种作用域:

    1. Singleton 单例:整个应用中只有一个 Bean 实例。
    2. Prototype 原型:每次注入时,都会创建一个新的 Bean 实例。
    3. Session 会话:在 Web 应用中,为每个会话创建一个 Bean 实例。
    4. Request 请求:在 Web 应用中,为每个请求创建一个 Bean 实例。

    建议在 Bean 上使用 @Scope(ConfigurableBeanFactory.SCOPE_XX) 来指定作用域。

    基于注解的自动化装配

    1. @Autowired:自动装配的核心在于 @AutoWired 注解,该注解可用在 bean 的构造器或者 setter 上,Spring 会自动为其注入匹配的依赖。(前提是只有一个 bean 满足要求,如果有多个匹配的 bean 会抛出异常)
    2. @Required:用在 bean 的 setter 上,表明该 setter 必须被注入。
    3. @Primary:当有多个同类 bean 时,可用它设置优先级
    4. @Qualifier
    5. @Resource

    运行时注入:

    属性占位符 (Property placeholder)

    这种方式允许将属性定义到外部的属性文件中,Spring 在运行时读取属性文件,并保存到 Envirement 的 Properties 中,再将占位符解析为对应的属性。
    属性占位符形式如${ ... }

    SpEL(Spring Expression Language)

    SpEL 用于在运行时将值注入到 bean 属性 和 构造器参数中。它和占位符的不同在于它是表达式,可以做运算;而占位符只能做简单的属性替换。

    基于 xml 的配置

    待续

    参考

  • 相关阅读:
    初探 Redis 客户端 Lettuce:真香!
    vscode 代码中查找并替换为换行符
    Jenkins Kubernetes插件添加 云
    Jenkins kubernetes插件的原理
    jenkins pipeline实现自动构建并部署至k8s
    python3 requests中的 stream参数
    rsync 开启用户密码认证
    rancher1版本 基本使用
    nginx http跳https
    sed合并多条指令修改文本
  • 原文地址:https://www.cnblogs.com/kirito-c/p/9199226.html
Copyright © 2011-2022 走看看