一、环境与profile
- 在开发软件的时候,一个很大的挑战是将应用程序从一个环境迁移到另外一个环境中。一种方式是在单独的配置类或者(XML文件)中配置咩哥bean,然后在构建阶段确定将哪一个人配置编译到可部署的应用中。
- 1.1、配置profile bean
- 在3.1版本中,Spring引入了bean profile功能。要使用profile,首先要将所有的bean定义整理到一个或多个profile中,在应用部署到每个环境时,要确保对应的profile处于激活状态。
- 但@Profile("dev")注解用在类上时,该类中的bean只有在dev环境中才会创建。
- 从Spring3.2开始,@Profile可以用在方法上,这样可以将两个不同环境中的bean的声明放到同一个配置类中。
- 没有指定profile的bean始终都会被创建,与是否激活无关。
- XML中也可以配置profile<beans profile="dev">......
- 激活profile
- 激活时以来两个独立的属性spring.profiles.active/spring.profiles.defualt。如果设置了active那激活active,否则激活default。
- 多种方式设置这两个属性:作为DispatcherServlet的初始化参数;作为web应用中的上下文参数;作为JNDI条目;作为环境变量;作为JVM的系统属性;在集成测试类上,使用@ActiveProfiles。在测试类上设置。
二、条件化的bean
- 在Spring4中引入了@Conditional注解,如果给定的条件计算结果为true,就会创建这个bean,否则这个bean会被忽略。
- 在该注解上添加参数类A,A实现Condition接口,重写matches方法,返回true或false
- 从Spring4开始,@Profile也是基于@Conditional和Condition实现。
三、处理自动装配的歧义性
- 如果三个类都实现了同一个接口,都使用了@Component注解,在创建的时候Spring无法作出选择返回那个类的对象。
- 3.1、标示首选的bean
- @Primary在类上,告诉Spring该类是首选的bean
- 3.2、限定自动装配的bean
- @Autowird和@Qualifier("cold")(搭配,在类名上加上一样的名称
- 通过声明自定义的限定符注解,我们可以同时使用多个限定符。
四、bean的作用域
- 默认情况下,Spring应用上下文中所有bean都是作为以单例的形势创建的。作用域有:单例,在整个应用中只创建一个bean的实例;原型,每次注入或者通过Spring应用上下文获取的时候都会创建一个新的bean实例;会话,在web应用中,为每个会话创建一个bean实例;请求,为WEB应用中,为每个请求创建一个bean实例。用@Scop("protatype")。xml中也可以配置
- 4.1、使用会话和请求作用域
- 4.2、在XML中声明作用域代理
五、运行时值注入
- 5.1、注入外部的值
- 通过在类上@PropertyResource("classpath:/com...../app.properties")声明属性源并通过Spring的Environment来检索属性
- 在Spring装配中,占位符的形势为使用"${...}"包装属性名称。
- 5.2、使用Spring表达式语言进行装配
- 将表SpEL语言表达式放到"#{...}"中。里面可以使用System.currentTimeMillis,Math.PI等值;
- 可以表示字面值,#{'hello'}
- 可以应用bean、属性、方法,#{sgtPeppers}
- 运算符,加减乘除等
- 计算正则
- 计算集合