文章目录
IOC容器Bean的生命周期的init和destroy方法
在Video类中添加init方法和destroy方法
public class Video {
private int id;
private String title;
public void init(){
System.out.println("video类 init 方法被调用");
}
public void destroy(){
System.out.println("video类 destroy 方法被调用");
}
public Video(){
}
public Video(String title){
this.title = title;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
在applicationContext.xml配置文件中为bean添加init方法和destroy方法
<bean id="video" class="net.xdclass.sp.domain.Video"
scope="singleton" init-method="init" destroy-method="destroy">
<property name="id" value="9"/>
<property name="title" value="Spring 5.X课程" />
</bean>
启动主类,运行测试:
public static void main(String [] args){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Video video = (Video)context.getBean("video");
System.out.println(video.getTitle());
((ClassPathXmlApplicationContext) context).registerShutdownHook(); //可以调用destroy方法
}
初始化时调用init方法,销毁时调用destroy方法
bean的二次加工-Spring5.x后置处理器 BeanPostProcessor
什么是BeanPostProcessor
1、是Spring IOC容器给我们提供的⼀个扩展接⼝
2、在调⽤初始化⽅法前后对 Bean 进⾏额外加⼯,ApplicationContext 会⾃动扫描实现了BeanPostProcessor的 bean,并注册这些 bean 为后置处理器
3、是Bean的统⼀前置后置处理⽽不是基于某⼀个bean
执行顺序
Spring IOC容器实例化Bean:调⽤BeanPostProcessor的postProcessBeforeInitialization⽅法
调⽤bean实例的初始化⽅法:调⽤BeanPostProcessor的postProcessAfterInitialization⽅法
BeanPostProcessor的使用
接口重写的两个⽅法不能返回null,如果返回null那么在后续初始化⽅法将报空指针异常或者通过getBean()⽅法获取不到bean实例对象
在applicationContext.xml配置文件中注册BeanPostProcessor:
<bean class="net.xdclass.sp.processor.CustomBeanPostProcessor"/>
创建类:
public class CustomBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("CustomBeanPostProcessor1 postProcessBeforeInitialization beanName="+beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("CustomBeanPostProcessor1 postProcessAfterInitialization beanName="+beanName);
return bean;
}
}
可以注册多个BeanPostProcessor顺序
在Spring机制中可以指定后置处理器调⽤顺序,通过BeanPostProcessor接⼝实现类实现
Ordered接⼝getOrder⽅法,该⽅法返回整数,默认值为0优先级最⾼,值越⼤优先级越低
Spring5.X bean自动装配Autowire属性
1、手工注入
属性注⼊,set⽅法、构造函数等,属于手工注入
2、Spring⾃动注⼊
使用元素的 autowire 属性为⼀个 bean 定义指定⾃动装配模式
3、autowire设置值
no:没开启
byName: 根据bean的id名称,注⼊到对应的属性⾥⾯
byType:根据bean需要注⼊的类型,注⼊到对应的属性⾥⾯,如果按照类型注⼊,存在2个及以上同类型bean的话会抛异常expected single matching bean but found 2
constructor: 通过构造函数注⼊,需要这个类型的构造函数
当存在两个bean(Video1和Video2)时会报错,因为videoorder会不知道注入video1还是video2