Bean注册到Spring容器中

一.Spring如何管理bean

1.@Resource 默认根据name匹配,未找到再根据type匹配;

2.@Autowired 根据类型匹配;

3.无实现类,根据接口生成代理类,把代理类放到FactoryBean的实现中,最后把FactoryBean的实现类注册到Spring容器中,本篇具体讲第三种方式。

二.核心步骤方法


public interface ITestDao {

    String test();

}


public class ProxyBeanFactory implements FactoryBean {

    /**

    * 返回实例对象

    * @return

    * @throws Exception

    */

    @Override

    public Object getObject() throws Exception {

        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

        Class[] classes = {ITestDao.class};

        InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName();

        return Proxy.newProxyInstance(classLoader, classes, handler);

    }

    /**

    * 返回实例类型

    * @return

    */

    @Override

    public Class getObjectType() {

        return ITestDao.class;

    }

    /**

    * 是否单例

    * @return

    */

    @Override

    public boolean isSingleton() {

        return true;

    }

}


@Component

public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor

{

    /**

    * 实现 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry方法,获取 Bean 注册对象。

    * 定义 Bean,GenericBeanDefinition,这里主要设置了我们的代理类工厂。

    * 创建 Bean 定义处理类,BeanDefinitionHolder,这里需要的主要参数;定义 Bean 和名称 setBeanClass(ProxyBeanFactory.class)。

    * 将 bean注册到spring容器中去,registry.registerBeanDefinition()

    * @param beanDefinitionRegistry

    * @throws BeansException

    */

    @Override

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {

        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();

        beanDefinition.setBeanClass(ProxyBeanFactory.class);

        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, "testDao");

        System.out.println("注册 testDao" + definitionHolder);

        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, beanDefinitionRegistry);

    }

    @Override

    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }

}


@Test

    public void test() {

        AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext(RegisterBeanFactory.class);

        ITestDao testDao = (ITestDao) application.getBean("testDao");

        String result = testDao.test();

        System.out.println(result);

    }

三.测试结果

image

你可能感兴趣的:(Bean注册到Spring容器中)