spring手写v2-di

关键类和关键方法

对象实例化

MyCapableBeanFactory的instantiateBean:将MyBeanDefinition转换为MyBeanWrapper并放入factoryBeanInstance的map中

属性赋值

MyCapableBeanFactory的populateBean给对象的属性设置值

代码

package formework.beans;
public interface MyBeanFactory {
    /**
     * 获取bean实例
     * @param beanName
     * @return
     */
    Object getBean(String beanName);
}

package formework.beans.factory.support;
import formework.annotation.GPAutowired;
import formework.annotation.GPService;
import formework.aop.MyProxyConfig;
import formework.aop.MyProxyFactory;
import formework.beans.MyBeanFactory;
import formework.beans.MyBeanWrapper;
import formework.beans.factory.config.MyBeanDefinition;
import formework.context.MyDefaultListableBeanFactory;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class MyCapableBeanFactory implements MyBeanFactory {
    //factaryName --> BeanWrapper
    private final Map<String, MyBeanWrapper> factoryBeanInstance = new ConcurrentHashMap();
    private MyDefaultListableBeanFactory defaultListableBeanFactory;
    private MyProxyConfig proxyConfig;
    private Properties properties;

    private MyCapableBeanFactory() {
    }

    public MyCapableBeanFactory(MyDefaultListableBeanFactory defaultListableBeanFactory, Properties properties) {
        this.defaultListableBeanFactory = defaultListableBeanFactory;
        this.properties = properties;
    }

    public MyBeanWrapper getBeanWrapper(String beanName){
        return factoryBeanInstance.get(beanName);
    }

    @Override
    public Object getBean(String beanName) {
        if(factoryBeanInstance.containsKey(beanName)){
            return factoryBeanInstance.get(beanName).getWrappedInstance();
        }

        MyBeanDefinition beanDefinition = defaultListableBeanFactory.getBeanDefinition(beanName);
        MyBeanWrapper myBeanWrapper = instantiateBean(beanDefinition);

        populateBean(beanDefinition, myBeanWrapper);

        return myBeanWrapper.getWrappedInstance();
    }

    /**
     * 构建对象
     * @param beanDefinition
     * @return
     */
    private MyBeanWrapper instantiateBean(MyBeanDefinition beanDefinition){
        if(null == beanDefinition){
            return null;
        }

        Object originalInstance = null;
        try {
            originalInstance = Class.forName(beanDefinition.getBeanClassName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        MyProxyFactory proxyFactory = new MyProxyFactory();
        proxyFactory.setInstance(originalInstance);
        proxyFactory.setProxyConfig(getProxyConfig());
        Object wrapperedInstance = originalInstance;
        if(originalInstance.getClass().isAnnotationPresent(GPService.class)){
            wrapperedInstance = proxyFactory.getProxy();
        }

        MyBeanWrapper beanWrapper = new MyBeanWrapper()
                .setWrappedInstance(wrapperedInstance)
                .setOriginalInstance(originalInstance)
                .setWrappedClass(wrapperedInstance.getClass());

        factoryBeanInstance.put(beanDefinition.getFactoryBeanName(), beanWrapper);

        return beanWrapper;
    }

    private MyProxyConfig getProxyConfig(){
        if(proxyConfig != null){
            return proxyConfig;
        }

        MyProxyConfig proxyConfig = new MyProxyConfig()
                .setPointCut(properties.getProperty("pointCut"))
                .setAspectClazz(properties.getProperty("aspectClass"))
                .setAspectBefore(properties.getProperty("aspectBefore"))
                .setAspectAfter(properties.getProperty("aspectAfter"))
                .setAspectAfterThrow(properties.getProperty("aspectAfterThrow"))
                .setAspectAfterThrowingName(properties.getProperty("aspectAfterThrowingName"));
        this.proxyConfig = proxyConfig;
        return proxyConfig;
    }

    /**
     * 设置属性值
     * @param beanDefinition
     * @param beanWrapper
     */
    private void populateBean(MyBeanDefinition beanDefinition, MyBeanWrapper beanWrapper){
        if(null == beanDefinition || null == beanWrapper){
            return;
        }

        //给属性赋值
        Class<?> originalClazz = beanWrapper.getOriginalInstance().getClass();
        for (Field field : originalClazz.getDeclaredFields()) {
            if(null == field.getAnnotation(GPAutowired.class)){
                continue;
            }

            if(!factoryBeanInstance.containsKey(field.getName())){
                getBean(field.getName());
            }

            if(factoryBeanInstance.containsKey(field.getName())){
                try {
                    field.setAccessible(true);
                    field.set(beanWrapper.getOriginalInstance(), factoryBeanInstance.get(field.getName()).getWrappedInstance());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public MyDefaultListableBeanFactory getDefaultListableBeanFactory() {
        return defaultListableBeanFactory;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 9,967评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,157评论 0 3
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 6,618评论 0 12
  • 这两天事情特别多,做一个作业弄得好烦。不知道为何莫名其妙的心情就变得很差。这两天事情比较多,也比较麻烦,也没有自己...
    ce2ed1b2dd70阅读 1,432评论 0 2

友情链接更多精彩内容