Spring之ApplicationContextAware、InitializingBean

版权声明:本文为博主原创文章,未经博主允许不得转载。 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指定的方法。         


猜你喜欢

转载自blog.csdn.net/qq360694660/article/details/80537801