spring揭秘pdf相关
ioc 容器工厂
beanFactory、applicationContext 都是接口beanFactory 容器中的类都是延迟生成的 只有去获取的时候 相应的bean才会初始化
applicationContext 容器中的类是创建这个容器之后,注入进去的bean就已经生成
DefaultListableBeanFactory 实现了beanFactory 、BeanDefinitionRegistry接口
BeanDefinitionRegistry 其中的方法 有registerBeanDefinition、getBeanDefinition等 beanDefinition 存储的是class 的信息
beanFactory 中的方法是getBean的一些方法
因此 DefaultListableBeanFactory 可以注册一些class 在beanFactory中,又可以从beanFactory 取出相应的对象
读取外部配置文件
支持两种格式文件:xml、properties实现是使用BeanDefinitionReader 的实现类,由BeanDefinitionReader的相应实现类负责将相应的配置文件内如读取并映射到beanDefinition中,然后将映射后的beanDefinition注册到beanDefinitionRegistry,beanDefinitionRegistry完成其的bean的注册和加载。
BeanDefinitionRegistry beanRegistry = <某个BeanDefinitionRegistry实现类,通常为➥ DefaultListableBeanFactory>; BeanDefinitionReader beanDefinitionReader = new BeandefinitionReaderImpl(beanRegistry); beanDefinitionReader.loadBeanDefinitions("配置文件路径");
`public static void main(String[] args)
{
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
BeanFactory container = (BeanFactory)bindViaPropertiesFile(beanRegistry);
FXNewsProvider newsProvider =(FXNewsProvider)container.getBean("djNewsProvider");
newsProvider.getAndPersistNews();
}
public static BeanFactory bindViaPropertiesFile(BeanDefinitionRegistry registry) {
PropertiesBeanDefinitionReader reader =
new PropertiesBeanDefinitionReader(registry);
reader.loadBeanDefinitions("classpath:../../binding-config.properties");
return (BeanFactory)registry;
}xml 文件的读取
public static void main(String[] args)
{DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
BeanFactory container = (BeanFactory)bindViaXMLFile(beanRegistry);
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("djNewsProvider");
newsProvider.getAndPersistNews();
}
public static BeanFactory bindViaXMLFile(BeanDefinitionRegistry registry)
{
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry);
reader.loadBeanDefinitions("classpath:../news-config.xml");
return (BeanFactory)registry;
// 或者直接
//return new XmlBeanFactory(new ClassPathResource("../news-config.xml"));
}
bean定义通过abstract属性声明为true,说明这个bean定义不需要实例化。
factorybean
FactoryBean是Spring容器提供的一种可以扩展容器对象实例化逻辑的接口,请不要将其与容器
名称BeanFactory相混淆。FactoryBean,其主语是Bean,定语为Factory,也就是说,它本身与其他注
册到容器的对象一样,只是一个Bean而已,只不过,这种类型的Bean本身就是生产对象的工厂
(Factory)。
`public class NextDayDateFactoryBean implements FactoryBean { public Object getObject() throws Exception {
return new DateTime().plusDays(1);
}
public Class getObjectType() {
return DateTime.class;
}
public boolean isSingleton() {
return false;
}
}`
要使用NextDayDateFactoryBean,只需要如下这样将其注册到容器即可:
<bean id="nextDayDateDisplayer" class="...NextDayDateDisplayer">
<property name="dateOfNextDay">
<ref bean="nextDayDate"/>
</property>
</bean>
<bean id="nextDayDate" class="...NextDayDateFactoryBean"> </bean>
public class NextDayDateDisplayer { private DateTime dateOfNextDay; // 相应的setter方法 // ... }
看到了嘛?NextDayDateDisplayer所声明的依赖dateOfNextDay的类型为DateTime,而不是
NextDayDateFactoryBean。也就是说FactoryBean类型的bean定义,通过正常的id引用,容器返回
的是FactoryBean所“生产”的对象类型,而非FactoryBean实现本身。
beanfactoryWare
容器在实例化实现了该接口的bean定义的过程
中,会自动将容器本身注入该bean。这样,该bean就持有了它所处的BeanFactory的引用。BeanFactoryAware的定义如下代码所示
实现beanFactory
public interface BeanFactoryAware { void **setBeanFactory**(BeanFactory beanFactory) throws BeansException; }
`public class MockNewsPersister implements IFXNewsPersister,BeanFactoryAware { private BeanFactory beanFactory;
public void **setBeanFactory**(BeanFactory bf) throws BeansException {
this.beanFactory = bf;
}
public void persistNews(FXNewsBean bean) {
persistNews();
}
public void persistNews()
{
System.out.println("persist bean:"+getNewsBean());
}
public FXNewsBean getNewsBean() {
return beanFactory.getBean("newsBean");
}
}`
`
BeanFactoryPostProcessor
这个允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition保存的信息做相应的修改
PropertyPlaceholderConfigurer 、CustomEditorConfigure、propertyOverideConfigurer
PropertyPlaceholderConfigurer 就是配置properties外部文件的
propertyOverideConfigurer 可以中配置的属性可以覆盖bean中的属性
CustomEditorConfigure XML所记载的,都是String类
型,即容器从XML格式的文件中读取的都是字符串形式,最终应用程序却是由各种类型的对象所构成。
要想完成这种由字符串到具体对象的转换(不管这个转换工作最终由谁来做),都需要这种转换规则
相关的信息,而CustomEditorConfigurer就是帮助我们传达类似信息的。
PropertyEditor来帮助进行String类型到其他类型的转换工作
bean的实例化和beanWrapper
默认情况下,容器内部采用的是CglibSubclassingInstantiationStrategy。
容器只要根据相应bean定义的BeanDefintion取得实例化信息,结合CglibSubclassingInstantiationStrategy以及不同的bean定义类型,就可以返回实例化完成的对象实例。但是,返回方
式上有些“点缀”。不是直接返回构造完成的对象实例,而是以BeanWrapper对构造完成的对象实例
进行包裹,返回相应的BeanWrapper实例。
BeanWrapper定义同时又直接或者间接继承了PropertyEditorRegistry
和TypeConverter接口。不知你是否还记得CustomEditorConfigurer?当把各种PropertyEditor注
册给容器时,知道后面谁用到这些PropertyEditor吗?对,就是BeanWrapper!在第一步构造完成
对象之后,Spring会根据对象实例构造一个BeanWrapperImpl实例,然后将之前CustomEditorConfigurer注册的PropertyEditor复制一份给BeanWrapperImpl实例(这就是BeanWrapper同时又
是PropertyEditorRegistry的原因)。这样,当BeanWrapper转换类型、设置对象属性值时,就不会无从下手了。
beanPostProcessor
与BeanFactoryPostProcessor通常会处理容器内所有符合条件的BeanDefinition类似,BeanPostProcessor会处理容器内所有符合条件的实例化后的对象实例。该接口声明了两个方法,分别在
两个不同的时机执行,见如下代码定义:
` [@Nullable](https://my.oschina.net/u/2896689)default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
[@Nullable](https://my.oschina.net/u/2896689)
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}`
可以通过BeanPostProcessor对当前对象实例做更多的处理。比如替换当前对象实例或者字节码增强当前对象实例等。Spring的AOP则更多地使用
BeanPostProcessor来为对象生成相应的代理对象,
以上是 spring揭秘pdf相关 的全部内容, 来源链接: utcz.com/z/517097.html