很多人学Spring框架,总觉得IOC模糊不清?( 二 )


//可以让我们自定义Bean的创建过程,完成复杂bean定义public interface FactoryBean<T> { //返回FactoryBean创建的实例,如果isSingleton返回true,则该实例会放到Spring容器的单例缓存池中Map @Nullable T getObject() throws Exception;    //返回FactoryBean创建的bean类型 @Nullable Class<?> getObjectType(); //返回作用域是否单例 default boolean isSingleton() {  return true; }}2.2.1 新建类CompanyFactoryBean,实现FactoryBean接口,并重写方法:
public class CompanyFactoryBean implements FactoryBean<Company> {    private String companyInfo;//注入公司名称,地址,规模  以逗号分隔    public void setCompanyInfo(String companyInfo) {        this.companyInfo = companyInfo;    }    @Override    public Company getObject() throws Exception {        //创建复杂对象Company        Company company=new Company();        String[] split = companyInfo.split(",");        company.setName(split[0]);        company.setAddress(split[1]);        company.setScale(Integer.parseInt(split[2]));        return company;    }    @Override    public Class<?> getObjectType() {        //返回bean的类型        return Company.class;    }    @Override    public boolean isSingleton() {        //是否是单例        return true;    }}public class Company {    private String name;    private String address;    private int scale; //省略getset 和toString}2.2.2 xml文件中配置bean
<bean id="companyBean" class="com.lagou.edu.factory.CompanyFactoryBean">   <property name="companyInfo" value=https://www.isolves.com/it/cxkf/kj/2020-12-03/"拉钩,中关村,500">2.2.3 测试
    @org.junit.Test    public void test(){        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        Object companyBean = applicationContext.getBean("companyBean");        System.out.println(companyBean);    }//结果返回的是 Company{name='拉钩', address='中关村', scale=500}   虽然在xml配置文件中配置的bean的class="com.lagou.edu.factory.CompanyFactoryBean" 但是返回的Company类型 。

如何返回CompanyFactoryBean类型呢?

很多人学Spring框架,总觉得IOC模糊不清?

文章插图
 
打印结果为:com.lagou.edu.factory.CompanyFactoryBean@545b995e
3. 后置处理器Spring提供了两种后处理bean的扩展接?,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使?上是有所区别的 。
??初始化(BeanFactory)—> Bean对象
在BeanFactory初始化之后可以使?BeanFactoryPostProcessor进?后置处理做?些事情
在Bean对象实例化(并不是Bean的整个?命周期完成)之后可以使?BeanPostProcessor进?后置处理做?些事情
注意:对象不?定是springbean,?springbean?定是个对象
3.1 SpringBean生命周期图
很多人学Spring框架,总觉得IOC模糊不清?

文章插图
 
按照上述描述的打印一下 。看看是否一致:
//实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean,DisposableBean接口public class Result implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {    private String status;    private String message; //省略getset toString方法    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("4.BeanFactoryAware:"+beanFactory);    }    @Override    public void setBeanName(String name) {        System.out.println("3.BeanNameAware:"+name);    }    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        System.out.println("5.ApplicationContextAware:"+applicationContext);    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("7.InitializingBean");    }    public void initMethodTest(){        System.out.println("8.initMethod");    }    @PostConstruct    public void postCoustrcut(){        System.out.println("postCoustrcut");    }    //销毁之前执行    @PreDestroy    public void preDestroy(){        System.out.println("销毁之前执行");    }    @Override    public void destroy() throws Exception {        System.out.println("DisposableBean");    }}


推荐阅读