spring注解 Configuration、Bean、Scope、Lazy注解

@Configuration注解:

        标注在类上,告诉spring这是一个配置类,配置类等同于配置文件,在使用时,将以往的ClassPathXmlApplicationContext("spring的xml文件全路径名"),用AnnotationConfigApplicationContext(配置类.class)代替,这样就可以通过配置类来创建容器。

@Configuration
public class MyConfig {
    static {
        System.out.println("配置类加载...");
    }
}

public class AnnotationTest {
    @Test
    public void testConfig(){
        System.out.println("======测试类开始======");
        ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println("======IOC容器创建完成======");

    }
}

        测试输出:

@Bean注解:

        给容器中注册一个bean,类型为返回值的类型,bean的id默认为其方法名,也可以在Bean注解中添加参数,对其进行自定义命名。

//配置类
@Configuration
public class MyConfig {

    static {
        System.out.println("配置类加载...");
    }

    @Bean("person")   //默认为方法名小写,返回的bean的id
    public Person getPerson(){
        System.out.println("向容器中添加person");
        return new Person("张三",20);
    }
}

//测试类
public class AnnotationTest {

    @Test
    public void testComponentScan(){
        System.out.println("======测试类开始======");
        ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println("======IOC容器创建完成======");
        String[] definitionNames = ctx.getBeanDefinitionNames();
        for (String name : definitionNames){
            System.out.println("bean 的定义名是:" + name);
        }
    }
}

        测试输出:

@Scope和@Lazy注解:

        scope注解用于设置组件的作用于,在缺省值的情况下,默认创建单实例对象,有4个可选值,一般情况下,选择

prototype和singleton两种。单实例时,IOC容器 启动时 就会调用方法创建对象,并将其放入IOC容器中, 以后每次获取,都是从IOC容器中拿取该对象;多实例时,IOC容器启动时不会调用方法创建对象, 而是在每次获取对象时,调用方法创建对象。

        懒加载可以看做scope单实例的一种特殊情况,IOC容器 启动时 不创建对象第一次获取对象时,创建对象并加入到容器中 以后每次获取,都是从IOC容器中拿取该对象。

//配置类
@Configuration
public class MyConfig2 {

    /**
     * SCOPE_SINGLETON = "singleton":   单实例
     *      在单实例情况下:
     *          IOC容器 启动时 就会调用方法创建对象,并将其放入IOC容器中,
     *          以后每次获取,都是从IOC容器中拿取该对象
     * SCOPE_PROTOTYPE = "prototype":   多实例
     *      在多实例情况下:
     *          IOC容器启动时不会调用方法创建对象,
     *          而是在每次获取对象时,调用方法创建对象
     * @Lazy:   懒加载
     *      单实例bean,IOC容器 启动时 不创建对象
     *      第一次获取对象时,创建对象并加入到容器中
     *      以后每次获取,都是从IOC容器中拿取该对象
     */
    //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //也可以写为:@Scope("prototype"),不加参数默认为单实例
    @Lazy
    @Bean("person")
    public Person getPerson(){
        System.out.println("向容器中添加person");
        return new Person("张三",23);
    }
}

//测试类
public class AnnotationTest {

    @Test
    public void testScope(){
        System.out.println("======测试类开始======");
        ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig2.class);
        System.out.println("======IOC容器创建完成======");
        Person p1 = ctx.getBean(Person.class);
        Person p2 = (Person) ctx.getBean("person");
        System.out.println(p1==p2);
    }
}

 

     三种情况下的输出:

        通过输出可以看到,缺省时,在IOC容器创建完成之前就先创建好了Bean,而懒加载和多实例时,都是在使用到Bean的时候,才进行创建,懒加载创建的Bean是同一个对象,而多实例创建的Bean是两个不同的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值