(该系列是观看雷老师的教学视频,加上自己上网查资料的总结)
使用@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实列