美文网首页
自定义实现一个Bean容器

自定义实现一个Bean容器

作者: 胡飞飞_1995 | 来源:发表于2019-06-08 13:14 被阅读0次

使用自定义注解实现了一个简单的支持包扫描的bean容器

加入依赖

    <dependency>
      <groupId>org.reflections</groupId>
      <artifactId>reflections</artifactId>
      <version>0.9.11</version>
    </dependency>

自定义一个注解

import java.lang.annotation.*;

/**
 * @author fei
 * @version V1.0
 * @date 2019/06/08 12:41
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Service {
    String value();
}

定义类并添加刚新建的注解

/**
 * @author fei
 * @version V1.0
 * @date 2019/06/08 12:41
 */
@Service("test1")
public class TestService1 {

    public void index() {
        System.out.println("Hello World TestService1");
    }
}

/**
 * @author fei
 * @version V1.0
 * @date 2019/06/08 12:45
 */
@Service(value = "test3")
public class TestService3 {

    public void index() {
        System.out.println("Hello World TestService3");
    }
}

新建bean工厂类对包进行扫描并处理

import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author fei
 * @version V1.0
 * @date 2019/06/08 12:42
 */
public class BeanFactory {
    /**
     * Bean对象容器
     */
    private static final Map<String, Object> BEAN_CONTAINER = new HashMap<>();

    /**
     * 对容器初始化
     * @param packageName
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static void init(String packageName) throws IllegalAccessException, InstantiationException {

        if (packageName == null || packageName.isEmpty()) {
            packageName = "com.study";
        }

        Reflections reflection = new Reflections(packageName);

        // 获得此路径下所有带有自定义Service注解的类
        Set<Class<?>> typesAnnotatedWith = reflection.getTypesAnnotatedWith(Service.class);

        // 将这些类通过反射 新建对象并保存到beanContainer
        for (Class<?> aClass : typesAnnotatedWith) {
            Object bean = aClass.newInstance();
            Service annotation = aClass.getAnnotation(Service.class);
            BEAN_CONTAINER.put(annotation.value(), bean);
        }
    }
    
    /**
     * 根据注解名获取对象
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName) {
        return BEAN_CONTAINER.get(beanName);
    }
}

定义一个主类

/**
 * @author fei
 * @version V1.0
 * @date 2019/06/08 12:54
 */
public class Main {

    public static void main(String[] args) {
        try {
            BeanFactory.init(null);

            TestService1 test1 = (TestService1) BeanFactory.getBean("test1");
            test1.index();

            TestService3 test3 = (TestService3) BeanFactory.getBean("test3");
            test3.index();
            
        } catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }
    }
}

启动后就能拿到我们的bean并执行相应的方法

输出如下:

Hello World TestService1
Hello World TestService3

github代码库地址:https://github.com/sethufeifei/customizeBeanContainer

相关文章

  • Spring Framework 5 Core 学习笔记

    IoC 容器 Bean 的作用域 自定义作用域实现 org.springframework.beans.facto...

  • Spring (IOC、DI)

    IOC容器是一个管理Bean的容器,它要求所有的Bean都需要实现接口BeanFactory是一个顶级的容器接口 ...

  • Spring的自定义标签

    Spring为自定义xml标签加载提供了扩展。用户可自定义标签并注册到Spring的bean容器中。实现较为复杂的...

  • ImportBeanDefinitionRegistrar与Be

    概述 如果想实现自定义注册bean到spring容器中,常见的做法有两种 @Import+ImportBeanDe...

  • 自定义实现一个Bean容器

    使用自定义注解实现了一个简单的支持包扫描的bean容器 加入依赖 自定义一个注解 定义类并添加刚新建的注解 新建b...

  • Spring 生命周期

    Bean生命周期 Bean创建 --> 初始化 --> 销毁过程 容器管理Bean生命周期 自定义初始化和销毁方法...

  • Bean的初始化过程

    Bean的初始化过程 bean创建-->初始化-->摧毁 容器管理bean的声明周期 我们可以自定义初始化...

  • Spring:Ioc容器中Bean生命周期

    容器的实现是通过Ioc管理Bean的生命周期来实现的。Spring Ioc容器在对Bean的生命周期进行管理时提供...

  • Spring注解06 @Bean生命周期

    bean的生命周期:bean创建---初始化----销毁的过程容器管理bean的生命周期: 我们可以自定义初始化和...

  • IOC容器之Bean的生命周期

    bean的生命周期: bean------的过程IOC容器管理bean的生命周期;但我们可以自定义初始化和销毁方法...

网友评论

      本文标题:自定义实现一个Bean容器

      本文链接:https://www.haomeiwen.com/subject/zdrixctx.html