Spring高级装配Bean
开发、测试和生产环境的配置和切换
开发 -> 测试 -> 部署上线,每个阶段的环境的配置参数会有不同,如数据源,文件路径等。为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过spring的profile功能来进行配置参数的切换。
使用xml进行配置profile
<!-- 开发环境配置文件 -->
<beans profile="development">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:development/*.properties" />
</beans>
<!-- 测试环境配置文件 -->
<beans profile="test">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:test/*.properties" />
</beans>
<!-- 生产环境配置文件 -->
<beans profile="production">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:production/*.properties" />
</beans>
设置spring.profiles.default和spring.profiles.active这两个属性来激活和使用对应的配置文件。default为默认,如果没有通过active来指定,那么就默认使用default定义的环境。
可以在web.xml文件中设置
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>development</param-value>
</context-param>
<!-- 在上下文context-param中设置profile.active的默认值 -->
<!-- 设置active后default失效,web启动时会加载对应的环境信息 -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>development</param-value>
</context-param>
配置默认值和激活状态值,若没设置激活状态,则现在环境以默认为主。
也可以直接对相应的资源设置相应的注解,只有选择相应的资源,那么相应的资源才会生效,比如可以对数据源进行注解,表明选择哪一个数据源。
使用JavaConfig配值Profile
在不同的配值文件上注解 @Profile("dev") @Profile("prod") 在激活时也可以使用注解 @ActiveProfiles("dev")
条件化Bean
如果希望一个Bean只有才包含某一个库时才创建,或者在某个特定环境下才进行创建。
@Conditional注解可以用到带Bean的注解上。 @ConditionalOnClass Classpath里有指定的类 @ConditionalOnMissingClass Classpath里缺少指定的类 @ConditionalOnExpression 给定的Spring Expression Language( SpEL)表达式计算结果为true @ConditionalOnJava Java的版本匹配特定值或者一个范围值 @ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNInitialContext @ConditionalOnProperty 指定的配置属性要有一个明确的值 @ConditionalOnResource Classpath里有指定的资源
自定义注解
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
- @Target:用户描述注解的作用范围
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
- @Retention:表示需要在什么级别保存该注释信息 取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)(常用)
- @Documented:Documented是一个标记注解
- @Inherited :用于声明一个注解;
自定义注解语法:
public @interface 注解名 {定义体}
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyComponent {
String value() default "";
}
@MyComponent
public static class InjectClass {
public void print() {
System.out.println("hello world");
}
}
注解的作用域和会话
最具有代表性的例子是用户购物车,如果购物车是单例,将导致所有用户同时向同一购物车购物,如果购物车是原型作用域,那么在应用的某一地方添加商品,在另一地方就不可用。
bean中的注解可以使用@Scope来声明作用域
@Component
@Scope(
value=WebApplicationContext.SCOPE_SESSION
proxyMode=ScopedProxyMode.INTERFACES
)
public ShoppingCart cart() {... ...}
Scope_session表明Spring会为Web应用中的每一个会话创建一个实例shoppingcart,在每一个会话中都是单例。
ScopedProxyMode,可以延迟注入请求和会话作用域的Bean
XML中声明作用域代理
xml中可以添加scope=”session“属性
运行时注入
在Spring中,处理外部源最简单的办法就是通过属性源并通过Spring的Environment来检索属性。
- 数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法
- [接口测试 -基础篇] 20 用flask写一个简单server用于接口测试
- 接口测试 | urllib篇 19 urllib基本示例
- 接口测试 | urllib篇 18 urllib介绍
- 【专知-Deeplearning4j深度学习教程01】分布式Java开源深度学习框架DL4j安装使用: 图文+代码
- .Net Core Runtime安装说明
- 【专知-Deeplearning4j深度学习教程02】用ND4J自己动手实现RBM: 图文+代码
- 【专知-Deeplearning4j深度学习教程03】使用多层神经网络分类MNIST数据集:图文+代码
- TypeScript 1.6发布:完全支持React/JSX
- 【专知-Java Deeplearning4j深度学习教程04】使用CNN进行文本分类:图文+代码
- sql server之数据库语句优化
- 【专知-Java Deeplearning4j深度学习教程05】无监督特征提取神器—AutoEncoder:图文+代码
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
- HDU 2689 Sort it【树状数组】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 解决Linux+Apache服务器URL区分大小写问题
- Centos8(最小化安装)全新安装Python3.8+pip的方法教程
- 使用 Linux seq 命令生成数字序列(推荐)
- CentOS 7上为PHP5安装suPHP的方法(彭哥)
- Linux修改主机名命令详解
- 在CentOS 7.2上安装SuPHP的详细方法
- centos6-7 yum安装php的方法(推荐)
- Linux修改用户所属组的方法
- centos通过yum安装php的教程
- 树莓派4安装Ubuntu 19.10的教程详解
- Linux系统(CentOS7安装)安装JDK8的教程详解
- Deepin中安装与使用virtualenv的教程
- linux安装jdk并设置环境变量的方法教程(看这一篇够了)
- hadoop基于Linux7的安装配置图文详解
- Linux paste命令的使用方法