版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq360694660/article/details/80537801
ApplicationContextAware接口
当一个类实现了这个接口之后,这个类就可以方便地获得ApplicationContext对象
Spring发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身ApplicationContext对象作为参数传给该方法。
package com.example.studySpringBoot.init;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringBeanInit implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("this is bean init set application");
this.applicationContext = applicationContext;
}
public Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}
InitializingBean 接口
当一个类实现这个接口之后,Spring启动时,初始化Bean时,若该Bean实现InitializingBean接口,则会自动调用afterPropertiesSet()方法,完成一些用户自定义的初始化操作。
package com.example.studySpringBoot.init;
import com.example.studySpringBoot.entity.Student;
import org.springframework.beans.factory.InitializingBean;
public class SpringBeanInit02 implements InitializingBean {
private Integer id;
private String name;
private Integer age;
private boolean sex;
private Student student;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("this is bean init set student data");
Student student = new Student(id,name,age,sex);
this.student = student;
}
public void testInit(){
System.out.println("this is bean web.xml init-method invock");
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
同样配置Bean时使用init-method也可以实现类似的操作
<bean id = "springBeanInit02" class = "com.example.studySpringBoot.init.SpringBeanInit02" init-method="testInit">
<property name="id" value="#{1111111}" />
<property name="name" value="${test.springEL}" />
<property name="age" value="#{10+8}" /> // SpringEL表达式
<property name="sex" value="false" />
</bean>
在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。
注意:
1、Spring是通过反射来调用init-method指定方法,而实现InitializingBean接口是直接调用afterPropertiesSet方法,所以后者效率高,但使用init-method方式减少对Spring的依赖。
2、如果调用afterPropertiesSet方法时出错,则不会再调用init-method指定的方法。