第三章 高级装配

一:配置profile bean

1.1 java 方式

在java中,使用@Profile注解制定某个bean属于哪一个profile


第三章 高级装配_第1张图片

该注解用在类级别上,表示只有在 dev profile激活时才会创建,否则忽略该类中带有@Bean注解的方法

spring3.2开始 @profile可以用在方法级别上


第三章 高级装配_第2张图片

1.2 xml方式


第三章 高级装配_第3张图片


第三章 高级装配_第4张图片

1.3激活profile

顺序: spring.profiles.active ----》spring.profiles.default----》没有激活的bean

Spring在确定哪个profile处于激活状态时, 需要依赖两个独立的属性:spring.profiles.active和spring.profiles.default。 如果设置了spring.profiles.active属性的话, 那么它的值就会用来确定哪个profile是激活的。 但如果没有设置spring.profiles.active属性的话, 那Spring将会查找spring.profiles.default的值。 如果spring.profiles.active和spring.profiles.default均没有设置的话, 那就没有激活的profile, 因此只会创建那些没有定义在profile中的bean。

有多种方式来设置这两个属性:

作为DispatcherServlet的初始化参数;

作为Web应用的上下文参数;

作为JNDI条目;

作为环境变量;

作为JVM的系统属性;

在集成测试类上, 使用@ActiveProfiles注解设置。

二:条件化的bean

Spring 4引入了一个新的@Conditional注解, 它可以用到带有@Bean注解的方法上。 如果给定的条件计算结果为true, 就会创建这个bean, 否则的话, 这个bean会被忽略。



第三章 高级装配_第5张图片

三:处理自动装配的歧义性

3.1标识首选的bean

将@Component注解的IceCreambean声明为首选的bean,但是如果有两个或更多的首选bean,那么就无法正常工作

3.1.1 java方式

@Component

@Primary

public class IceCream implemente Dessert{

}

3.1.2xml方式

3.2限定自动装配的bean

@Qualifier注解是使用限定符的主要方式。 它可以与@Autowired和@Inject协同使用, 在注入的时候指定想要注入进去的是哪个bean,为@Qualifier注解所设置的参数就是想要注入的bean的ID,依赖于将bean ID作为限定符,这里的问题在于setDessert()方法上所指定的限定符与要注入的bean的名称是紧耦合的。 对类名称的任意改动都会导致限定符失效。

此时iceCream是一个IceCream的bean

@Autowired

@Qualifier("iceCream")

public void setDessert(Dessert dessert){

this.dessert=dessert;

}

3.3创建自定义的限定符

在bean声明上添加@Qualifier注解


第三章 高级装配_第6张图片


3.4 使用自定义的限定符注解

Java不允许在同一个条目上重复出现相同类型的多个注解


第三章 高级装配_第7张图片

四: bean的作用域

4.1 Spring定义了多种作用域, 可以基于这些作用域创建bean, 包括

单例(Singleton) : 在整个应用中, 只创建bean的一个实例。

原型(Prototype) : 每次注入或者通过Spring应用上下文获取的时候, 都会创建一个新的bean实例。

会话(Session) : 在Web应用中, 为每个会话创建一个bean实例。

请求(Rquest) : 在Web应用中, 为每个请求创建一个bean实例

4.2 组件扫描中:

@Component

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public class  Nptepad{

}

4.3 java方式

@Bean

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public clas  Nptepad{

}

4.4 xml方式


4.5 使用会话和请求作用域 ****


第三章 高级装配_第8张图片

4.6 在XML中声明作用域代理  ****


第三章 高级装配_第9张图片


五:运行时值注入

5.1 硬编码


第三章 高级装配_第10张图片

5.2 注入外部的值

5.2.1 使用@PropertySource注解和Environment


第三章 高级装配_第11张图片

5.2.2 解析属性占位符


第三章 高级装配_第12张图片

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