关于spring:Spring-Aware接口注入

Aware主动注入

  • BeanNameAware
  • BeanFactoryAware
  • ApplicationContextAware
  • MessageSourceAware
  • ApplicationEventPublisherAware
  • ResourceLoaderAware

Aware接口 形容
BeanNameAware 能够在Bean中失去它在IOC容器中的Bean的实例的名字
BeanFactoryAware 能够在Bean中失去Bean所在的IOC容器,从而间接在Bean中应用IOC容器的服务。
ApplicationContextAware 能够在Bean中失去Bean所在的利用上下文,从而间接在Bean中应用上下文的服务。
MessageSourceAware 在Bean中能够失去音讯源。
ApplicationEventPublisherAware 在bean中能够失去利用上下文的事件公布器,从而能够在Bean中公布利用上下文的事件。
ResourceLoaderAware 在Bean中能够失去ResourceLoader,从而在bean中应用ResourceLoader加载内部对应的Resource资源。 在设置Bean的属性之后,调用初始化回调办法之前,Spring会调用aware接口中的setter办法。

实例类Holder/Rumenz

package com.rumenz;

import org.springframework.beans.factory.BeanNameAware;

public class Holder implements BeanNameAware {

    private Rumenz rumenz;

    public Holder(Rumenz rumenz) {
        this.rumenz = rumenz;
    }

    public Rumenz getRumenz() {
        return rumenz;
    }

    public void setRumenz(Rumenz rumenz) {
        this.rumenz = rumenz;
    }
    @Override
    public void setBeanName(String name) {
        System.out.println("BeanName: "+name);
    }
}


// Rumenz.java

package com.rumenz;

public class Rumenz {

    private Integer id;
    private String name;

    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;
    }
}

配置文件Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
    <bean id="rumenz" class="com.rumenz.Rumenz">
        <property name="id" value="123"/>
        <property name="name" value="入门小站"/>
    </bean>

调用

package com.rumenz;

public class DemoApplication implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, MessageSourceAware, ApplicationEventPublisher,ResourceLoaderAware {


    @Autowired
    private Holder holder;

    private  static BeanFactory beanFactory;

    private  static  ApplicationContext applicationContext;

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();


        XmlBeanDefinitionReader xr=new XmlBeanDefinitionReader(ac);
        xr.loadBeanDefinitions("Beans.xml");

        ac.register(DemoApplication.class);
        ac.refresh();
        DemoApplication bean = ac.getBean(DemoApplication.class);
        System.out.println(bean.holder.getRumenz().getName());
        System.out.println(applicationContext==ac);
        System.out.println(ac.getBeanFactory()==beanFactory);

        ac.close();
    }

    @Bean
    public Holder holder(Rumenz rumenz){
        return new Holder(rumenz);
    }


    @Override
    public void setBeanName(String name) {
        System.out.println("BeanName =:"+name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory=beanFactory;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext=applicationContext;
    }

    @Override
    public void setMessageSource(MessageSource messageSource) {
        System.out.println("messageSource"+messageSource);
    }

    @Override
    public void publishEvent(ApplicationEvent event) {

    }

    @Override
    public void publishEvent(Object event) {

    }
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {

    }
}

原文: https://rumenz.com/rumenbiji/Spring-Aware-Injection.html