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 上的注解
@Component表示该类是一个组件类,Spring 需要创建该类的实例。它是一个通用注解,而下述三个注解都是它的特化。- @Repository:持久层 bean
- @Service:服务层 bean
- @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:
- 测试环境下,可在测试类上使用
spring-test模块提供的@ActiveProfile("development")激活开发 Profile - 使用JVM的命令行参数:
-Dspring.profiles.active="profile1,profile2",顺便可见是能同时激活多个 Profile 的。 - 被
@Profile("default")注解了的 Bean,在没有其他 Bean 被激活的情况下,会被自动激活。(其实就是自动设置了 spring.profiles.default 属性) - 通过 ApplicationEcontext 的
getEnvironment().setActiveProfiles()方法,激活 Profile。(不过感觉不太好) - servlet context parameters in
web.xml,添加如下标签:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>development</param-value>
</context-param>
Properties
一般在配置类上使用 @PropertySource 注解来自动读取属性文件。再使用属性占位符(${...})的方式来使用属性值。
属性占位符可以用在配置类中、xml 配置中、Bean Class 定义中。
如果需要使用 属性做为 构造器/工厂函数 的参数,可使用 @Value("${ ... }") 来注入属性值。
使用属性占位符,需要配置一个 PropertySourcesPlaceholderConfigurer bean,有了这个 bean 才能将占位符解析为环境中的属性。
Scope
Spring 在默认情况下,所有的 Bean 都是单例的(Singleton)。但有时也可能会需要用到非单例模式。
Spring 提供了以下几种作用域:
- Singleton 单例:整个应用中只有一个 Bean 实例。
- Prototype 原型:每次注入时,都会创建一个新的 Bean 实例。
- Session 会话:在 Web 应用中,为每个会话创建一个 Bean 实例。
- Request 请求:在 Web 应用中,为每个请求创建一个 Bean 实例。
建议在 Bean 上使用 @Scope(ConfigurableBeanFactory.SCOPE_XX) 来指定作用域。
基于注解的自动化装配
- @Autowired:自动装配的核心在于 @AutoWired 注解,该注解可用在 bean 的构造器或者 setter 上,Spring 会自动为其注入匹配的依赖。(前提是只有一个 bean 满足要求,如果有多个匹配的 bean 会抛出异常)
- @Required:用在 bean 的 setter 上,表明该 setter 必须被注入。
- @Primary:当有多个同类 bean 时,可用它设置优先级
- @Qualifier
- @Resource
运行时注入:
属性占位符 (Property placeholder)
这种方式允许将属性定义到外部的属性文件中,Spring 在运行时读取属性文件,并保存到 Envirement 的 Properties 中,再将占位符解析为对应的属性。
属性占位符形式如${ ... }
SpEL(Spring Expression Language)
SpEL 用于在运行时将值注入到 bean 属性 和 构造器参数中。它和占位符的不同在于它是表达式,可以做运算;而占位符只能做简单的属性替换。
基于 xml 的配置
待续
参考
Spring 笔记(三)Bean 装配的更多相关文章
- Spring系列(三) Bean装配的高级技术
profile 不同于maven的profile, spring的profile不需要重新打包, 同一个版本的包文件可以部署在不同环境的服务器上, 只需要激活对应的profile就可以切换到对应的环境 ...
- 使用Spring IoC进行Bean装配
Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...
- Spring学习笔记(三)之装配Bean
除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...
- Spring系列(二) Bean装配
创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...
- Spring学习(三)--高级装配
一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...
- Spring笔记三
Spring-03 1. AOP 1.1 概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
本书可作为王富强所著<<Spring揭秘>>一书的读书笔记 第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...
- spring笔记(三)
Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的“事务控制”, 可以用aop实现! 即只需要写一次,运行时候动 ...
- Spring笔记(三)AOP前篇之动态代理
AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态 ...
- Spring(三):bean的自动装配
Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...
随机推荐
- 2017.10.12 Java的计数器的开发
//我们用一个合成的applet/application来简单显示出一个计数器的结果/** * Created by qichunlin on 2017/10/12. */ /*简单的计数器*/ im ...
- jQuery性能优化和技巧
jQuery性能优化 ①使用最新版本的jQuery类库 ②使用合适的选择器 ③缓存对象 ④循环时的DOM操作 ⑤数组方式使用jQuery对象 ⑥事件代理 ⑦将你的代码转化成jQuery插件 ⑧使用jo ...
- Java日志框架介绍
一.序言 日志为系统的必不可少的一部分,通过输出的日志我们可以排查线上出现的各种问题,就像断案的线索一样.我们还可以通过日志数据分析用户的行为习惯做大数据分析. 二.日志框架分类及其历史 框架的种类: ...
- 基于 win7下虚拟机的 GNSS-SDR安装过程
最近在安装 GNSS-SDR软件时,遇到了很多问题,这里回顾了我的安装过程,罗列了所遇到的问题和解决办法.希望后来者不要再踩这些坑了! 首先,在官方文档中看到,GNSS-SDR目前并不支持直接在 Wi ...
- 交换机基础配置之三层交换机实现vlan间通信
我们以上面的拓扑图做实验,要求为pc1,pc2,pc3配置为vlan10,pc4,pc5,pc6配置为vlan20,pc7,pc8,pc9配置为vlan30 server0和server1配置为vla ...
- LeetCode969. 煎饼排序
问题:969. 煎饼排序 给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序.我们要执行零次或多次煎饼翻转(按顺序一次接 ...
- Python学习之登陆认证
需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提 ...
- Centos7上docker的安装和基本使用
Centos7上Docker的相关操作 Docker的安装 1.检查内核版本 docker使用linux的内核必须是3.10以上,首先需要 # uname -r 2.使用yum安装docker # y ...
- H5拍照、选择图片上传组件核心
背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决 ...
- (转)为什么国外 MMORPG 中不采用自动寻路等功能?
不只是自动寻路,现在网游中的教学引导系统,辅助系统的功能强大程度,友好程度都可以说到了变态的程度,开发这些功能投入的资源甚至要超过游戏内容本身.究其原因,还是竞争越来越激烈,人心越来越浮躁,游戏商家为 ...