Spring学习之路-高级装配

来源:互联网 发布:mysql官网下载旧版本 编辑:程序博客网 时间:2024/06/07 01:48

综述

1 条件化bean-conditional

2 处理自动装配的歧义-主要涉及两个标签@primary,@Qualifier。

3 bean的作用域

4 运行注入 @value

1 条件化bean

  • @Conditional注解后面的类会实现Condition接口,当@Conditional注解中指定的类为真时,spring容器才会创建MagicConfig的bean,才能够将MagicConfig类注入到其他的类中,当@Conditional注解指定类为false时,如果注入这个类就会报错。
@Configurationpublic 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//@Primarypublic class Cookies implements Dessert{    public void sys() {        System.out.println("Cookies.......");    }}@Componentpublic 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]);        }    }}
原创粉丝点击