spring-mybatis

factoryBean

  1.  factoryBean是一个bean.也意味着可以通过getBean的方式获取出来,如
/**
 * @author lh
 * @version 1.0
 * @date 2019-09-23 15:04
 */
public class Service implements FactoryBean {

    @Override
    public Object getObject() throws Exception {
        return new MyTest();
    }

    @Override
    public Class getObjectType() {
        return MyTest.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

2、factoryBean是一个特殊bean。需要实现FactoryBean 接口,也就是说存在依赖关系。获取bean的时候如果是按照如下的方式去获取的话,那么获取到的bean就是其本身:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
		annotationConfigApplicationContext.getBean("&service");

如果按照上述的方式去获取bean,那么实际获取到对象就是getObject返回的对象。

BeanFactoryPostProcessor

spring是如何实例化bean的,其实是将bean的信息封装到beanDefinition里面,在这个类里面包含有类的以下信息:name、懒加载、依赖关系、type、单例等。其中里面有一个非常重要的标识是:BeanClass。所以实际实例化哪个类,和实际的类没有多大的关系,关键是在beanDefinition中该字段对应的类名有关。而且该类是可以被程序员进行修改的,只是需要实现一个接口:

BeanFactoryPostProcessor

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;

/**
 * @author lh
 * @version 1.0
 * @date 2019-09-09 14:26
 */
class ThreadB implements BeanFactoryPostProcessor{

   @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        GenericBeanDefinition testDaoImpl = (GenericBeanDefinition)beanFactory.getBeanDefinition("testDaoImpl");
        // testDaoImpl.setBeanClassName(UserDaoImpl.class.getName());
        testDaoImpl.setBeanClass(UserDaoImpl.class);
    }
   
}

BeanDefinitionRegistryPostProcessor

如果有一个需求,将自己实例化的对象注入到bean中,怎么办呢?这个时候我们想到了上述的BeanDefinitionRegistryPostProcessor实现类。但是这个类没有向外界提供新增bean的方法,只能是更新相关的值。那么这个时候就需要一个接口:ImportBeanDefinitionRegistrar。

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author lh
 * @version 1.0
 * @date 2019-09-24 15:33
 */
public class VolatileTest implements ImportBeanDefinitionRegistrar {

    /**
     * 注入程序员自己的对象到spring管理的bean中
     * @param annotationMetadata
     * @param beanDefinitionRegistry
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(MyFactoryBean.class);
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        beanDefinitionRegistry.registerBeanDefinition("myFactoryBean", beanDefinition);
    }
}

在MyFactoryBean里的代码如下:

package spring_mybatis;

import org.springframework.beans.factory.FactoryBean;
import spring_mybatis.dao.TestDao;
import spring_mybatis.dao.impl.UserDaoImpl;

import java.lang.reflect.Proxy;

/**
 * @author lh
 * @version 1.0
 * @date 2019-09-27 11:17
 */
public class MyFactoryBean implements FactoryBean {


    /**
     * 这个方法很重要,是产生代理类的重要手段
     * @return
     * @throws Exception
     */
    @Override
    public Object getObject() throws Exception {
        Class[] interfaces = new Class[]{TestDao.class};
        TestDao dao = (TestDao)Proxy.newProxyInstance(MyFactoryBean.class.getClassLoader(), interfaces, new MyInvocationHandler());
        return dao;
    }

    @Override
    public Class getObjectType() {
        return UserDaoImpl.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

 

 

 

 

你可能感兴趣的:(spring-mybatis)