1 环境与profile(解决代码重新构建问题)
1.1 配置profile bean,使用@Profile注解(此注解可用于类或方法上),当@Profile注解的bean被激活时才创建,而被@Profile注解未被激活的bean不会创建,其它未被@Profile注解的bean都会被创建;在XML配置中,可使用profile属性进行同等功能配置
1.2 激活profile,依赖spring.profiles.active和spring.profiles.default,active优先级高于default,若两个都没有设置则不对profile进行激活。设置这两个属性的方式:
1)作为DispatcherServlet的初始化参数;
2)作为Web应用的上下文参数;
3)作为JNDI条目;
4)作为环境变量;
5)作为JVM的系统属性;
6)在集成测试类上,使用@ActiveProfiles注解设置;
在激活profile中可激活多个profile,其中多个profile之间要使用逗号分隔
------------------------------------
2 条件化的bean,使用@Conditional注解来实现。其中@Conditional(类)括号中的条件类为实现了Condition接口的类,主要使用此接口中的boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata);方法进行判断。方法中的ConditionContext对象的作用如下:
1)借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;
2)借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性;
3)借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;
4)读取并探查getResourceLoader()返回的ResourceLoader所加载的资源;
5)借助getClassLoader()返回的ClassLoader加载并检查类是否存在
------------------------------------
3 处理自动装配的歧义性,使用@Primary或@Qualifier
------------------------------------
4 bean的作用域,可使用@Scope指定
1)单例(Singleton):整个应用唯一
2)原型(Prototype):每次注入或通过Spring应用上下文获取时,都会新创实例
3)会话(Session):在Web应用中,为每个会话创建一个bean实例
4)请求(Request):在Web应用中,为每个请求创建一个bean实例
ScopedProxyMode.INTERFACES表示生成基于接口的代理类;ScopedProxyMode.TARGET_CLASS表示生成基于类的代理类
------------------------------------
5 运行时值注入,属性占位符(Property placeholder)和Spring表达式语言(SpEL)
5.1 直接通过Environment检索属性
1)String getProperty(String key):直接返回值
2)String getProperty(String key, String defaultValue):直接返回值,不存在时使用默认值defaultValue
3)T getProperty(String key, Class
4)T getProperty(String key, Class
5)String[] getActiveProfiles():返回激活profile名称的数组
6)String[] getDefaultProfiles():返回默认profile名称的数组
7)boolean acceptsProfiles(String... profiles):如果environment支持给定的profile,就返回true
5.2 占位符使用形式:${...},使用前要配置一个PropertySourcesPlaceholderConfigurer;在XML配置中使用
5.3 使用Spring表达式语言进行装配,使用方式为#{...},SpEL的特性:
1)使用bean的ID来引用bean
2)调用方法和访问对象的属性
3)对值进行算术、关系和逻辑运算
4)正则表达式匹配
5)集合操作