前言

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 的配置

待续

参考

Spring 笔记(三)Bean 装配的更多相关文章

  1. Spring系列(三) Bean装配的高级技术

    profile 不同于maven的profile, spring的profile不需要重新打包, 同一个版本的包文件可以部署在不同环境的服务器上, 只需要激活对应的profile就可以切换到对应的环境 ...

  2. 使用Spring IoC进行Bean装配

    Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...

  3. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  4. Spring系列(二) Bean装配

    创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...

  5. Spring学习(三)--高级装配

    一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...

  6. Spring笔记三

    Spring-03 1. AOP 1.1 概念 ​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...

  7. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  8. spring笔记(三)

    Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的“事务控制”, 可以用aop实现! 即只需要写一次,运行时候动 ...

  9. Spring笔记(三)AOP前篇之动态代理

    AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态 ...

  10. Spring(三):bean的自动装配

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...

随机推荐

  1. java、javac -version不一致(java编译及运行环境不一致)的环境变量设置问题解决

    问题描述: 电脑上同时安装了JDK1.6与1.7  设置了环境变量JAVA_HOME为jdk1.6.0_21的安装目录,并且在PATH变量中加入了%JAVA_HOME%\bin,但在Windows命令 ...

  2. java基础必备单词讲解 day six

    development development development development 开发 development developmentenvironment environment en ...

  3. Linq to Entity 时间差作为筛选条件产生的问题

    前言 在使用 Linq to Entity 的時候,會把之前 Linq to SQL 的想法就帶進去,寫好之後編譯也都不會出錯,但是實際上在跑的時候就會出現錯誤訊息了,這點真的要注意了.這次我遇到問題 ...

  4. webpack4基本配置

    1.npm init      生成package.json文件 2.npm install webpack webpack-cil --save-dev 安装webpack和webpack-cli ...

  5. A的B次幂

    Description 给出两个正整数A和B 请输出A的B次幂 结果可能很大,请对1000000007求模 Input A和B,两个整数均不大于10^18 Output A的B次幂对100000000 ...

  6. SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别。

    DROP: DROP TABLE test; 删除表test,并释放空间,将test删除的一干二净. TRUNCATE: TRUNCATE test; 删除表test里的内容,并释放空间,但不删除表的 ...

  7. 协程实现tcp两个客户端的通讯

    import socket import gevent from gevent import monkey monkey.patch_all() def cb_work(recv_num,send_n ...

  8. JAVAOOP集合框架

    集合框架三大内容:对外的接口.接口的实现和对集合运算的算法 集合有三大类接口:List.Set.Map 共同点:都是集合接口,都可以用来存储很多对象 不同:Collection接口存储一组不唯一(允许 ...

  9. 类的特殊方法"__call__"详解

    1. __call__ 当执行对象名+括号时, 会自动执行类中的"__call__"方法, 怎么用? class A: def __init__(self, name): self ...

  10. Java中的二进制运算出错问题

    问题: 最近在做Java web项目中需要计算金额总和,在这里出现了一个问题是我以前没有关注到的: System.out.println(2.0-1.1); 执行时候的console中打印输出的是 0 ...