Skip to content

Context

B1o0dy_Trey edited this page Feb 23, 2020 · 10 revisions

annotation

AnnotationApplicationContext是使用注解扫描bean的上下文。

构造方法参数:

  • String... scanPaths:需要扫描的包。允许传入多个路径。

在启动上下文时需要调用start()方法。可以通过使用getBean()方法获取bean实例。

例如,获取src/main/java/bean下beanName为“exampleBean”的bean,示例如下:

public class Example{
    public static void main(String[] args){
        AnnotationApplicationContext context = new AnnotationApplicationContext("bean");
        context.start();
        ExampleBean bean = context.getBean("exampleBean");
    }
}

有关更多的获取bean的方法,请查看api文档。

processor

BeanPostProcessor

此接口用于对新构造的实例进行自定义的修改。实现该接口的类需要使用@Named注解标注。该接口有两个方法:

  • Object postProcessBeforeInitializtion(String beanName, Object bean):在实例化后,注入依赖前对bean进行自定义。
  • Object postProcessAfterInitializtion(String beanName, Object bean):在实例化后,注入依赖后对bean进行自定义。

下面是一个例子:

这是一个Bean类

@Named
public class Bean{
    String properties;
    public void setProperties(String properties){
        this.properties = properties;
    }
}

实现BeanPostProcessor接口,可以对Bean进行自定义:

@Named
public class ProcessorExample1 implements BeanPostProcessor{
    @Override
    public Object postProcessBeforeInitializtion(String beanName, Object bean) throws BeansException {
    	bean.setProperties("BeforeInitializtion");
    	return bean;
    }
    
    @Override
    public Object postProcessAfterInitializtion(String beanName, Object bean) throws BeansException {
        bean.setProperties("AfterInitializtion");
        return bean;
    }
}

BeanFactoryPostProcessor

BeanFactoryPostProcessor是处理beanFactory中beanDefination的接口,通过实现此接口,可以管理所有beanDefination(未实例化的Bean信息)。

下面是一个例子

@Named
public class ProcessorExample2 implements BeanFactoryPostProcessor{
	public void postProcessBeanFactory(ConfigurableBeanFactory beanFactory) throws BeansException {
        //获取所有的beanDefinition
        Map<String, BeanDefinition> beanDefinations = beanFactory.getBeanDefinitions();
        //后续操作
        ...
    }
}

aware

实现ResourceReaderAware、BeanFactoryAware、ClassLoaderAware接口的Bean可以从上下文中获取对应的属性。

  • ResourceReaderAware:实现此接口可以获取资源读取器。
  • BeanFactoryAware:实现此接口获取bean工厂。
  • ClassLoaderAware:实现此接口获取类加载器。

下面是一个例子:

@Named
public class AwareExample implements ResourceReaderAware, BeanFactoryAware, ClassLoaderAware{
    private ClassLoader classloader;
    private BeanFactory beanfactory;
    private ResourceReader resourceReader;
    //从上下文中获取ResourceReader
    @Override
    public void setResourceReader(ResourceReader resourceReader) throws BeansException{
        this.resourceReader = resourceReader;
    }
    //从上下文中获取BeanFactory
    @Override
    public void setBeanFactory(BeanFactory beanFactory){
        this.beanFactory = beanFactory;
    }
    //从上下文中获取ClassLoader
    @Override
    public void setClassLoader(ClassLoader classLoader){
        this.classLoader = classLoader;
    }
}