spring手写源码示例

samples包

samples包含aop包和各个类

aop包

AfterReturningAdviceImpl类

package com.lv.spring.samples.aop;

import com.lv.spring.aop.advice.AfterReturningAdvice;

import java.lang.reflect.Method;

/**
 * Created by lvyanghui
 * 2019/1/11 11:29
 */
public class AfterReturningAdviceImpl implements AfterReturningAdvice{

    @Override
    public void afterReturing(Object returnValue, Method method, Object[] args,Object target) {
        System.out.println("后置增强调用 afterMethod 方法.......");
    }
}

MethodBeforeAdviceImpl类

package com.lv.spring.samples.aop;

import com.lv.spring.aop.advice.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * Created by lvyanghui
 * 2019/1/11 11:27
 */
public class MethodBeforeAdviceImpl implements MethodBeforeAdvice {
    @Override
    public void beforeMethod(Method method, Object[] args, Object target) {
        System.out.println("前置增强调用beforeMethod方法.......");
    }
}

MethodInterceptorImpl类

package com.lv.spring.samples.aop;

import com.lv.spring.aop.advice.MethodInterceptor;

import java.lang.reflect.Method;

/**
 * Created by lvyanghui
 * 2019/1/11 11:32
 */
public class MethodInterceptorImpl implements MethodInterceptor {
    @Override
    public Object invoke(Method method, Object[] args, Object target) throws Exception{

        System.out.println("环绕增强调用 aroundMethod 方法.......前");

        Object result = method.invoke(target,args);

        System.out.println("环绕增强调用 aroundMethod 方法.......后");
        return result;
    }
}

samples其他类

ABean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/19 16:44
 */
public class ABean {

    public void initMethod(){

        System.out.println("ABean 执行初始化方法.....");
    }

    public void methodA(){
        System.out.println("ABean 执行methodA.......");
    }

    public void destoryA(){
        System.out.println("ABean 执行destoryA.......");
    }


}

ABeanFactory类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/19 16:44
 */
public class ABeanFactory {


    public static ABean getBeanByFactory(){

        return new ABean();
    }

    public ABean getBeanByFactoryBean(){

        return new ABean();
    }

}

AopBean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2019/1/11 15:59
 */
public class AopBean {

    public String methodOne(int i, String name){

        System.out.println("调用methodOne......" + i + name);

        return name;
    }


    public void methodTwo(){
        System.out.println("调用 methodTwo......");
    }
}

BBean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/19 16:44
 */
public class BBean {

    private String name;

    private ABean aBean;

    public BBean() {
    }

    public BBean(String name) {
        this.name = name;
    }

    public BBean(String name, ABean aBean) {
        this.name = name;
        this.aBean = aBean;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ABean getaBean() {
        return aBean;
    }

    public void setaBean(ABean aBean) {
        this.aBean = aBean;
    }
}

BBeanFactory类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/19 16:44
 */
public class BBeanFactory {


    public static BBean getBeanByFactory(String name, ABean aBean){

        return new BBean();
    }

    public BBean getBeanByFactoryBean(String name, ABean aBean,String kk){

        return new BBean();
    }

}

CBean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/25 11:16
 */
public class CBean {
    private DBean dBean;

    public CBean(DBean dBean) {
        this.dBean = dBean;
    }
}

DBean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/25 11:16
 */
public class DBean {

    private CBean cBean;

    public DBean(CBean cBean) {
        this.cBean = cBean;
    }
}

EBean类

package com.lv.spring.samples;

/**
 * Created by lvyanghui
 * 2018/12/25 11:33
 */
public class EBean {

    private String name;

    private int age;

    private ABean aBean;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public ABean getaBean() {
        return aBean;
    }

    public void setaBean(ABean aBean) {
        this.aBean = aBean;
    }
}

test包

AopTest类

package com.lv;

import com.lv.spring.aop.AdvisorAutoProxyCreator;
import com.lv.spring.aop.advisor.AspectJPointCutAdvisor;
import com.lv.spring.bean.GenericBeanDefinition;
import com.lv.spring.bean.PreBuildBeanFactory;
import com.lv.spring.samples.AopBean;
import com.lv.spring.samples.aop.AfterReturningAdviceImpl;
import com.lv.spring.samples.aop.MethodInterceptorImpl;
import com.lv.spring.samples.aop.MethodBeforeAdviceImpl;
import org.junit.Test;

/**
 * Created by lvyanghui
 * 2019/1/11 16:29
 */
public class AopTest {

    static PreBuildBeanFactory beanFactory = new PreBuildBeanFactory();

    @Test
    public void aopTest()throws Exception{

        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(AopBean.class);

        beanFactory.registerBeanDefinition("aop",beanDefinition);

        beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MethodBeforeAdviceImpl.class);
        beanFactory.registerBeanDefinition("beforeAdvice",beanDefinition);

        beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(AfterReturningAdviceImpl.class);
        beanFactory.registerBeanDefinition("afterAdvice",beanDefinition);

        beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MethodInterceptorImpl.class);
        beanFactory.registerBeanDefinition("aroundAdvice",beanDefinition);

        AdvisorAutoProxyCreator creater = new AdvisorAutoProxyCreator();
        beanFactory.registryBeanPostProcessor(creater);

        creater.registryAdvisor(new AspectJPointCutAdvisor("execution(* com.lv.spring.samples.AopBean.method*(..))","afterAdvice"));
        creater.registryAdvisor(new AspectJPointCutAdvisor("execution(* com.lv.spring.samples.AopBean.method*(..))","aroundAdvice"));
        creater.registryAdvisor(new AspectJPointCutAdvisor("execution(* com.lv.spring.samples.AopBean.method*(..))","beforeAdvice"));

        beanFactory.preInstantiateSingletons();

        AopBean aopBean = (AopBean)beanFactory.getBean("aop");

        aopBean.methodTwo();
        aopBean.methodOne(1,"jjj");

    }
}

BeanFactoryDITest类

package com.lv;


import com.lv.spring.bean.BeanRefernerce;
import com.lv.spring.bean.GenericBeanDefinition;
import com.lv.spring.bean.PreBuildBeanFactory;
import com.lv.spring.bean.PropertyValue;
import com.lv.spring.samples.ABean;
import com.lv.spring.samples.BBean;
import com.lv.spring.samples.BBeanFactory;
import com.lv.spring.samples.EBean;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lvyanghui
 * 2018/12/19 16:46
 */
public class BeanFactoryDITest {

    static PreBuildBeanFactory beanFactory = new PreBuildBeanFactory();

    @Test
    public void registerConstructorDI()throws Exception{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABean.class);
        beanFactory.registerBeanDefinition("aa01", bd);

        bd = new GenericBeanDefinition();
        bd.setBeanClass(BBean.class);

        List defs = new ArrayList<>();
        defs.add("lvyanghui");
        defs.add(new BeanRefernerce("aa01"));
        bd.setConstructorArgumentValues(defs);

        beanFactory.registerBeanDefinition("bb01",bd);

        beanFactory.preInstantiateSingletons();

        BBean bBean = (BBean)beanFactory.getBean("bb01");
        System.out.println(bBean);

    }

    @Test
    public void registerStaticFactoryMethod()throws Exception{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABean.class);
        beanFactory.registerBeanDefinition("aa02", bd);

        bd = new GenericBeanDefinition();
        bd.setBeanClass(BBeanFactory.class);
        bd.setFactoryMethodName("getBeanByFactory");

        List defs = new ArrayList<>();
        defs.add("lvyanghui");
        defs.add(new BeanRefernerce("aa02"));
        bd.setConstructorArgumentValues(defs);

        beanFactory.registerBeanDefinition("BBeanFactory",bd);
        beanFactory.preInstantiateSingletons();

        BBean bBean = (BBean)beanFactory.getBean("BBeanFactory");
        System.out.println(bBean);
    }

    @Test
    public void registerFactoryMethod()throws Exception{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABean.class);
        beanFactory.registerBeanDefinition("aa03", bd);

        bd = new GenericBeanDefinition();
        bd.setBeanClass(BBeanFactory.class);
        String fbname = "factory";
        beanFactory.registerBeanDefinition(fbname, bd);

        bd = new GenericBeanDefinition();
        bd.setFactoryBeanName(fbname);
        bd.setFactoryMethodName("getBeanByFactoryBean");

        List defs = new ArrayList<>();
        defs.add("lvyanghui");
        defs.add(new BeanRefernerce("aa03"));
        defs.add("ssssss");
        bd.setConstructorArgumentValues(defs);

        beanFactory.registerBeanDefinition("BBeanFactory01",bd);
        beanFactory.preInstantiateSingletons();

        BBean bBean = (BBean)beanFactory.getBean("BBeanFactory01");
        System.out.println(bBean);


    }

    @Test
    public void registerPropertyDI()throws Exception{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABean.class);
        beanFactory.registerBeanDefinition("aa04", bd);

        bd = new GenericBeanDefinition();
        bd.setBeanClass(EBean.class);

        PropertyValue property1 = new PropertyValue("name","lvyang");
        PropertyValue property2 = new PropertyValue("age",20);
        BeanRefernerce beanRefernerce = new BeanRefernerce("aa04");
        PropertyValue property3 = new PropertyValue("aBean",beanRefernerce);


        List<PropertyValue> propertyValues = new ArrayList<>();
        propertyValues.add(property1);
        propertyValues.add(property2);
        propertyValues.add(property3);
        bd.setPropertyValues(propertyValues);

        beanFactory.registerBeanDefinition("ee",bd);

        beanFactory.preInstantiateSingletons();

        EBean eBean = (EBean)beanFactory.getBean("ee");

        System.out.println(eBean.getName() + eBean.getAge() + eBean.getaBean());
        System.out.println(eBean);

    }
}

BeanFactoryTest类

package com.lv;


import com.lv.spring.bean.BeanDefinition;
import com.lv.spring.bean.BeanDefinitionRegistryException;
import com.lv.spring.bean.DefaultBeanFactory;
import com.lv.spring.bean.GenericBeanDefinition;
import com.lv.spring.samples.ABean;
import com.lv.spring.samples.ABeanFactory;
import org.junit.AfterClass;
import org.junit.Test;

/**
 * Created by lvyanghui
 * 2018/12/19 16:46
 */
public class BeanFactoryTest {

    static DefaultBeanFactory beanFactory = new DefaultBeanFactory();

    @Test
    public void register()throws BeanDefinitionRegistryException{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABean.class);
        //bd.setScope("singleton");
        //bd.setScope("prototype");
        bd.setInitMethodName("initMethod");
        bd.setDestroyMethodName("destoryA");
        beanFactory.registerBeanDefinition("aa", bd);
    }

    @Test
    public void registerStaticFactoryMethod()throws BeanDefinitionRegistryException{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABeanFactory.class);
        bd.setFactoryMethodName("getBeanByFactory");

        beanFactory.registerBeanDefinition("ABeanFactory", bd);
    }

    @Test
    public void registerFactoryMethod()throws BeanDefinitionRegistryException{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(ABeanFactory.class);
        String fbname = "factory";
        beanFactory.registerBeanDefinition(fbname, bd);

        bd = new GenericBeanDefinition();
        bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        bd.setFactoryBeanName(fbname);
        bd.setFactoryMethodName("getBeanByFactoryBean");
        beanFactory.registerBeanDefinition("ABeanFactory01",bd);

    }

    @AfterClass
    public static void testFactory()throws Exception{

        System.out.println("spring 构造方式------------");
        for (int i = 0; i < 3; i++) {
            ABean abean = (ABean)beanFactory.getBean("aa");
            System.out.println(abean);
        }


        System.out.println("spring 静态工厂方式------------");
        for (int i = 0; i < 3; i++) {
            ABean abean = (ABean)beanFactory.getBean("ABeanFactory");
            System.out.println(abean);
        }

        System.out.println("spring 工厂方法方式------------");
        for (int i = 0; i < 3; i++) {
            ABean abean = (ABean)beanFactory.getBean("ABeanFactory01");
            System.out.println(abean);
        }
    }
}

CirculationDiTest类

package com.lv;

import com.lv.spring.bean.BeanRefernerce;
import com.lv.spring.bean.GenericBeanDefinition;
import com.lv.spring.bean.PreBuildBeanFactory;
import com.lv.spring.samples.CBean;
import com.lv.spring.samples.DBean;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lvyanghui
 * 2018/12/25 11:15
 */
public class CirculationDiTest {

    static PreBuildBeanFactory beanFactory = new PreBuildBeanFactory();

    @Test
    public void testCirculationDi()throws Exception{

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(CBean.class);
        List defscc = new ArrayList<>();
        defscc.add(new BeanRefernerce("dd"));
        bd.setConstructorArgumentValues(defscc);
        beanFactory.registerBeanDefinition("cc", bd);

        bd = new GenericBeanDefinition();
        bd.setBeanClass(DBean.class);

        List defsdd = new ArrayList<>();
        defsdd.add(new BeanRefernerce("cc"));
        bd.setConstructorArgumentValues(defsdd);
        beanFactory.registerBeanDefinition("dd",bd);

        DBean dBean = (DBean)beanFactory.getBean("dd");
        System.out.println(dBean);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值