第二章 高级装配

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 type):直接返回指定对象

4)T getProperty(String key, Class type, T defaultValue):直接返回指定对象,不存在时使用默认对象defaultValue

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)集合操作

 

你可能感兴趣的:(第二章 高级装配)