Spring学习之路-高级装配

1 条件化bean
  • @Conditional注解后面的类会实现Condition接口,当@Conditional注解中指定的类为真时,spring容器才会创建MagicConfig的bean,才能够将MagicConfig类注入到其他的类中,当@Conditional注解指定类为false时,如果注入这个类就会报错。
@Configuration
public class MagicExists {
    @Bean()
    @Conditional(MagicCondition.class)
    public MagicConfig magicBean() {
        return new MagicConfig();
    }
}
2处理自动装配的歧义
  • 一个接口和四个接口的实现类和一个测试类,当运行测试方法时,会报错,因为存在3个满足条件的bean,spring容器也不知道去创建那个对象的bean,所以需要通过注解指定。
public interface Dessert {
    void sys();
}

public class Cake implements Dessert {
    public void sys() {
        System.out.println("Cake.......");
    }
}

@Component
//@Primary
public class Cookies implements Dessert{

    public void sys() {
        System.out.println("Cookies.......");
    }
}

@Component
public class IceCream implements Dessert {

    public void sys() {
        System.out.println("ice.......");
    }
}

//test测试类
public class Test extends BaseTestCase{
    private Dessert dessert;

    public Dessert getDessert() {
        return dessert;
    }

    @Autowired
    //@Qualifier("iceCream")
    public void setDessert(Dessert dessert) {
        this.dessert = dessert;
    }

    @org.junit.Test
    public void test(){
        dessert.sys();
    }
}
  • 然后我在Cookies 类上面加了一个@Primary标签,发现不出现错误了,通过输出知道容器创建了Cookies 的bean。
  • 当存在两个@Primary标签时,仍然会报错,因为容器发现了两个@Primary注解指定的类,
  • 当用注解@Qualifier(“iceCream”)指定创建的bean时,出现多个@Primary会创建beanId为iceCream的bean,容器创建每个bean时都会创建一个beanId用于唯一指定一个bean,默认情况下为首字符小写的类名。
3 bean的作用域
  • 默认的情况下spring创建的bean都是单例的,不管这个bean被注入过多少次,注入的都是这个bean。通过@Scope(“prototype”)注解指定bean的作用域。
  • 单例(Singleton):在整个应用中之创建一个实例。
  • 原型(ProtoType):每次注入或者通过Spring上下文获取的时候,都会创建一个新的bean实例。
  • 会话(Session):在WEB应用中,为每个会话创建bean的一个实例。
  • 请求(Request):在WEB应用中,为每个请求创建一个bean实例。
  • 扩展:请求和会话的区别:请求指从客户端发送请求到服务器处理请求结束,会话是用户的全局变量,只要页面不关闭一直有效,会话的过期时间是30min。
4 运行注入
  • 通过Spring默认的Environment类,默认去读取去读取application.properties文件的配置,当通过@PropertySource指定了读取的配置类,当前类中的Environment类,读取的就是@PropertySource指定的类。
  • @Value默认读取application.properties文件中的属性值,在一个@PropertySource(app.properties)指定读取的路径下的一个类,@Value读取的属性值如果在application.properties和app.properties同时存在与两个配置文件中,会优先读取application.properties配置中的属性值,如果application.properties没有@Value注解想读取的属性值,会去@PropertySource指定配置文件中读取这个属性,如果还没有,会报错,找不到到这个属性值。
@Configuration
@PropertySource("classpath:/config/app.properties")
public class ReadPropertiesConfig {

    @Autowired
    Environment evn;

    @Value("${magic}")
    private String str;

    public User getUserInfo() {
        System.out.println("@Value$取值+" + str);
        return new User("通过Environment获取配置值:" + evn.getProperty("name"), evn.getProperty("pwd"));
    }

    public void getActiveProfiles() {
        String str[] = evn.getActiveProfiles();
        for (int i = 0; i < str.length; i++) {
            System.out.println(str[i]);
        }
    }

    public void getDefaultProfiles() {
        String name = evn.getProperty("name");
        System.out.println("evn get name" + name);
        String str[] = evn.getDefaultProfiles();
        for (int i = 0; i < str.length; i++) {
            System.out.println(str[i]);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值