spring文档阅读笔记(二)

本文介绍Spring框架中Bean的生命周期管理,包括BeanPostProcessor接口的使用,BeanFactoryPostProcessor接口的作用,配置占位符的使用方法及FactoryBean接口的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实现beanPostProcesor(后置处理器理)bean初始化完成前后的操作(调用用户定义的init-method的前后操作)

public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {

    // simply return the instantiated bean as-is
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean; // we could potentially return any object reference here...
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("Bean '" + beanName + "' created : " + bean.toString());
        return bean;
    }
}

spring生命周期

image

BeanPostProcessor接口将对所有的bean都起作用,即所有的bean初始化前后都会回调BeanPostProcessor实现类

2.容器扩展点:后置处理器BeanFactoryPostProcessor

Spring允许BeanFactoryPostProcessor在容器创建bean之前读取bean配置元数据,并可进行修改。例如增加bean的属性和值,重新设置bean是否作为自动装配的侯选者,重设bean的依赖项等等。

接口如下

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

接口只有一个方法postProcessBeanFactory。该方法的参数是ConfigurableListableBeanFactory类型,实际开发中,我们常使用它的getBeanDefinition()方法获取某个bean的元数据定义:BeanDefinition。

参考资料:http://blog.youkuaiyun.com/soonfly/article/details/69486291

3spring配置占位

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:com/foo/strategy.properties</value>
    </property>
    <property name="properties">
        <value>custom.strategy.class=com.foo.DefaultStrategy</value>
    </property>
</bean>

<bean id="serviceStrategy" class="${custom.strategy.class}"/>

4.FactoryBean

对于xml配置比较复杂的我们可以实现FactoryBean接口用代码的形式进行注入

根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取,如getBean("&myBean")

那么现在我们可以通过getBean("personBean")来获取该对象。那么我们来看下如果通过实现FactoryBean以后该怎么写呢?来看下我们的PersonFactoryBean的代码:

public class PersonFactory implements FactoryBean<Person>{  
      
    private String personInfo;  
      
    public Person getObject() throws Exception {  
        Person person =  new  Person () ;      
        String []  infos =  personInfo.split ( "," ) ;  
        person.setName(infos[0]);  
        person.setAddress(infos[1]);  
        person.setAge(Integer.parseInt(infos[2]));  
        return person;  
    }  
  
    public Class<Person> getObjectType() {  
        return Person.class;  
    }  
  
    public boolean isSingleton() {  
        return true;  
    }  
}  

我们看到,这里PersonFactoryBean实现了FactoryBean接口,那么自然也要实现它定义的方法。这里我们是通过一个personInfo字符串解析得到Person对象,那么我们在配置Spring的时候就可以这么配置:

<bean id="personFactory" class="com.hik.MavenTest.PersonFactory">  
    <property name="personInfo" value="gh2,address2,22"></property>  
</bean> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值