springboot-注解使用(1)-@Cofiguration @Bean @Lazy @Scope

(该系列是观看雷老师的教学视频,加上自己上网查资料的总结)

使用@Configuration (配置注解)和@Bean注解将实列注入到ioc容器中

package springboot.configure;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springboot.apibean.Caraliu;

/**
 * @author jeffchan 2020/03/20
 */
@Configuration
public class Configure {

    @Lazy // 开启懒加载
    @Scope("singleton") // 单实例
    @Bean(name = "caraliu0") // 指定注入的bean和bean的名称
    public Caraliu caraliu(){
        return new Caraliu();
    }
}

上述代码会将Caraliu实列加入到IOC容器中管理,bean的名字默认为caraliu
你可以通过改方法名来改注入实列id,当然也可以加注解的属性@Bean(name = "caraliu0")
     注意不同版本的spring,可能注解的属性不一样

在Caraliu类中加入两个方法

public void init(){
        System.out.println("init...");
    }
    public void destory(){
        System.out.println("destory...");
    }

然后通过属性进行设置,指明初始化和销毁的方法:

@Bean(name = "caraliu0",initMethod = "init",destroyMethod = "destory")

处了上述方式,还是让bean实现两个接口, InitializingBean, DisposableBean

 重写两个方法:

@Override
public void destroy() throws Exception {
    System.out.println("destroyx..");
}

@Override
public void afterPropertiesSet() throws Exception {
    System.out.println("initx..");
}

也可以实现初始化和销毁

还可以用注解方式指定:

@PostConstruct
public void initX(){
    System.out.println("PostConstruct...");
}

但是调用时间:  PostConstruct 》 接口实现的方式 》 @Bean的方式  销毁的也一样

注意针对单实例没有设置懒加载的对象的时候,容器创建就会初始化,容器关闭的时候,会调用销毁方法;如果是懒加载的话,那么容器容器创建时不会初始化,在使用对象时才会初始化,容器关闭的时候,同样会调用销毁方法;但是对于实列,容器创建的时候不会初始化,在使用对象的时候会初始化,初始化完后,关闭容器,不会调用销毁方法。

 

bean的后置处理器:BeanPostProcessor

package springboot.configure;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author jeffchan 2020/03/22
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessBeforeInitialization");
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessAfterInitialization");
        return o;
    }
}

会在bean的初始化前后调用这两个方法。

 

以下看下源码:

if (mbd == null || !mbd.isSynthetic()) {
//初始化之前
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        try {
//执行初始化方法
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }

        if (mbd == null || !mbd.isSynthetic()) {
//初始化之后
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

 

spring底层很多都用BeanPostProcessor来实现,比如属性的注入,@BeanPostConstruct等都是。


上述的实列注入默认都是单实例的singleton,可以通过@Scope来指定实列的类型
多实列: prototype

以下两种都是基于web应用的:
一个请求一个bean: request
一个运用一个bean:  session

懒加载(懒加载是针对单实例来说的),上述的bean,如果不设置@Lazy,那么启动IOC容器的时候,就已经创建bean,当为了节省资源时,可以
设置懒加载,设置懒加载后,bean不会马上创建,而是当要使用相关的bean的时候,才会去加载bean实列
     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章