-
Notifications
You must be signed in to change notification settings - Fork 17
Context
B1o0dy_Trey edited this page Feb 23, 2020
·
10 revisions
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文档。
此接口用于对新构造的实例进行自定义的修改。实现该接口的类需要使用@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是处理beanFactory中beanDefination的接口,通过实现此接口,可以管理所有beanDefination(未实例化的Bean信息)。
下面是一个例子
@Named
public class ProcessorExample2 implements BeanFactoryPostProcessor{
public void postProcessBeanFactory(ConfigurableBeanFactory beanFactory) throws BeansException {
//获取所有的beanDefinition
Map<String, BeanDefinition> beanDefinations = beanFactory.getBeanDefinitions();
//后续操作
...
}
}
实现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;
}
}