spring--IOC/DI(三)

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();
    }
}

posted @ 2020-07-21 10:37  Dave-Mo  阅读(54)  评论(0)    收藏  举报