spring--bean装配(三)
bean的限定使用
package com.spring.study.primary.bean;
public interface Food {
void description();
}
@Qualifier限定名称
package com.spring.study.primary.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class FoodConfig {
private Food food;
@Autowired
@Qualifier("iceCream")
public void setFood(Food food) {
this.food = food;
}
}
自定义注解
package com.spring.study.primary.bean;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface ColdCream {
}
package com.spring.study.primary.bean;
import org.springframework.stereotype.Component;
@Component
@ColdCream
public class IceCream implements Food {
@Override
public void description() {
System.out.println("ice-cream");
}
}
@Parimary形式
package com.spring.study.primary.bean;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
/**
* 标注@Primary解决同类型bean冲突
*/
@Component
@Primary
public class Meat implements Food {
@Override
public void description() {
System.out.println("Meat");
}
}
测试
package com.spring.study.bean.primary.bean;
import com.spring.study.primary.bean.ColdCream;
import com.spring.study.primary.bean.Food;
import com.spring.study.primary.bean.FoodConfig;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FoodConfig.class)
@Slf4j
public class FoodTest {
@Autowired
// @Qualifier("iceCream")
@ColdCream
private Food food;
@Test
public void testFood(){
Assert.assertNotNull(food);
food.description();
}
}
bean作用域
- Singleton --- 整个应用只创建一个bean实例
- Prototype --- 每次注入和上下文获取时都会创建新的bean实例
- Session --- 每个会话创建一个bean实例
- Request --- 每个请求创建一个bean实例
package com.spring.study.bean.scope;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
//原型模式
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ScopePrototype {
public void scope(){
Scope scope = ScopePrototype.class.getAnnotation(Scope.class);
String value = scope.value();
System.out.println(value);
}
}
package com.spring.study.bean.scope.bean;
import com.spring.study.bean.scope.ScopePrototype;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ScopePrototype.class)
public class ScopePrototypeTest {
@Autowired
private ScopePrototype scopePrototype;
@Test
public void testPrototype(){
scopePrototype.scope();
}
}