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

回到顶部