Spring MVC学习笔记(三)

第三章 高级装配
1,@Configuration 
@Profile("dev") 配置profile Bean
两个独立的属性:spring.profile.active  spring.profile.default
@ActivieProfile
2,@Conditional(MagicExistsCondition.class//一个实现Condition接口的类)注解与Condition接口
在Spring4中,@Profile的实现如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {
    String[] value();
}
3,处理自动装配的歧义性
1)设置首选@Primary
<bean id="iceCream"
    class="com.desserteater.IceCream"
    primary="true"/>
2)使用限定符@Qualifier
默认限定符:如果没有指定其他的限定符的话,所有的bean都会给定一个默认的限定符,这个限定符与bean的ID相同。
所有使用@Component注解声明的类都会创建为bean,并且bean的ID为首字母变为小写的类名。
@Autowire的
@Qualifier("iceCream")
public void setDessert(Dessert dessert) {
    this.dessert = dessert;
}
1>基于默认的beanID作为限定符会使上述方法与要注入的bean的名称紧耦合,对类名称的任意改动都会导致限定符失效。
2>创建自定义的限定符(在bean声明上添加@Qualifier注解。
@Component
@Qualifier("cold")
public class IceCream implements Dessert {....}
3>自定义的限定符注解当有两个bean声明为同样的限定符时会发生歧义,此时可使用自定义的限定符注解。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD,ElementType.TYPE, ElementType.METHOD})
@Qualifier
public @interface Cold {
    String[] value();
}//通过在定义时添加@Qualifier注解,该类就具有了@Qualifier注解的特性。
类似可定义@Creamy  @Fruity
@Component
@Cold
@Creamy
public class IceCream implements Dessert {....}

@Component
@Cold
@Fruity
public class Poosicle implements Dessert {....}
这样上述两个bean可以被区分,在装配时也同样声明两个限定符
@Autowire的
@Cold
@Creamy
public void setDessert(Dessert dessert) {
    this.dessert = dessert;
}
之所以自定义限定符注解,是因为在Java8之前不允许在同一个条目上反复出现相同类型的多个注解。Java8中允许但要求该注解在定义的时候带有@Repeatable注解,而@Spring的@Qualifier注解并没有在定义时添加@Repeatable注解。
4,bean的作用域
在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。每次注入的都是同一个实例。
多种作用域:
单例(singleton)
原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
会话(Session):在Web应用中,为每个会话创建一个bean实例。
请求(Request):在Web应用中,为每个会话创建一个bean实例。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Notepad { ... }
或 <bean id="notepad" class="com.myapp.Notepad" scope="prototype"/>
使用会话和请求作用域bean需要注意的是,在需要注入单例bean遇到的问题:
单例bean会在Spring应用上下文加载的时候创建,而此时会话域的bean并不存在,直到某个用户进入系统,创建了会话之后,才会出现会话域的bean。
解决方法是,Spring在创建单例bean时,注入会话域bean的代理,直到使用会话域bean的方法时,代理会对其进行懒解析并将调用委托给会话域bean。因此需要设置proxyMode属性。
@Component
@Scope( value = ConfigurableBeanFactory.SCOPE_SESSION, proxyMode=ScopeProxyMode.INTERFACES)//
public ShoppingCart cart() { ... }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值