8.高级装配(二)
3. 处理bean歧义性
1. 使用首选bean
-
标识为primary的bean将被使用,如果有多个bean标识为primary,这仍会有冲突
-
Bean
@Component @Primary public class Man {}
-
XML
<bean id="man" class="com.desmond.demo.Man" primary="true"></bean>
2. 使用Qualifier限定符
-
限定符用于缩小bean的范围
public interface B { } @Component public class B1 implements B { } @Component public class B2 implements B { }
@Component public class A { @Qualifier("b2") @Autowire private B b; }
-
为声明的bean创建自定义限定符
public interface B { } @Component public class B1 implements B { } @Qualifier("b2Custom") @Component public class B2 implements B { }
@Component public class A { @Qualifier("b2Custom") @Autowire private B b; }
-
自定义限定符
-
自定义一个注解,引入@Qualifier注解即可
@Target(...) @Retention(...) @Qualifier public @interface B1Anno() {} @Target(...) @Retention(...) @Qualifier public @interface B2Anno() {} public interface B { } @B1Anno @Component public class B1 implements B { } @B2Anno @Component public class B2 implements B { }
@Component public class A { @B2Anno @Autowire private B b; }
4. bean作用域
-
作用域
- 单例(Singleton)
- 原型(Prototype)
- 会话(Session), web应用
- 请求(Request), web应用
-
Java
@Scope(scopeName = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.INTERFACES) @Component public class ShoppingCar { }
-
Xml
<bean id="car" class="com.desmond.springlearning.scope.ShoppingCar" scope="session"> <aop:scoped-proxy proxy-target-class="true"></aop:scoped-proxy> </bean>
相当于 @Scope里的 proxyMode作用.
5. 运行时注入
- 占位符, ${xxx}
- Spring表达式SpEL #{xxx}