`
regular
  • 浏览: 76952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

把Spring容器中的bean绑定到通过代码创建的对象

    博客分类:
  • Java
阅读更多
Spring提供了对配置中创建对象的字段实例注入。但如果是通过代码创建或者动态创建的对象,由于不受Spring管理,因此没有机会执行字段实例的注入。Google了一把,没发现可以用的方法。因此只能写了一小段代码。对于这种情况,可以通过反射的方式找到对象的字段和方法定义,并注入之。以下为具体实现。Registry类保存了Spring生成的context,在需要的时候随时可以调用。
public final class Registry
{
    private Registry() {}

    private static ApplicationContext context;

    public static void setApplicationContext(ApplicationContext context)
    {
        Registry.context = context;
    }

    public static <T> T getBean(String configName, Class<T> cls)
    {
        return getBean(configName, cls, null);
    }

    public static <T> T getBean(String configName, Class<T> cls, T defaultValue)
    {
        assert (context != null);
        T value = context.getBean(configName, cls);
        return (value != null) ? value : defaultValue;
    }

    public static void wire(Object o)
    {
        wire(o, o.getClass());
    }

    private static void wire(Object o, Class<?> cls)
    {
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            Autowired autowired = field.getAnnotation(Autowired.class);
            if (autowired != null) {
                Class<?> fieldClass = field.getDeclaringClass();
                Object bean = context.getBean(fieldClass);
                if (bean != null) {
                    field.setAccessible(true);
                    try {
                        field.set(o, bean);
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        Method[] methods = cls.getDeclaredMethods();
        for (Method method : methods) {
            Autowired autowired = method.getAnnotation(Autowired.class);
            if (autowired != null) {
                Class<?>[] paramTypes = method.getParameterTypes();
                if (paramTypes.length == 1) {
                    Object bean = context.getBean(paramTypes[0]);
                    if (bean != null) {
                        method.setAccessible(true);
                        try {
                            method.invoke(o, bean);
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        Class<?> superCls = cls.getSuperclass();
        if (!superCls.equals(Object.class)) {
            wire(o, superCls);
        }

    }

    public static void stopContext()
    {
        assert (context != null);
        ((Lifecycle) context).stop();
    }
}
分享到:
评论

相关推荐

    spring在@Bean注解中initMethod调用方法异步

    在Spring框架中,`@Bean`注解是一个关键的组件,用于声明一个方法将返回的对象作为Spring容器中的bean。在`@Bean`中定义`initMethod`属性,可以指定该bean初始化时需要调用的方法。当`initMethod`被设置为异步执行,...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    总结来说,Spring Boot允许开发者轻松地在普通类中使用bean,通过Spring容器的强大功能来管理对象和依赖。通过理解并熟练运用上述知识点,可以更高效地开发Spring Boot应用。博客"17. Spring Boot普通类调用bean【从...

    Spring的IoC容器初始化源码解析

    Spring通过依赖注入的方式,可以在运行时动态地将依赖注入到相应的组件中,这样就可以避免硬编码和其他类型的静态绑定,从而提高了系统的灵活性和可扩展性。 #### 三、BeanFactory与ApplicationContext 在Spring中...

    Spring的IoC容器

    5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器可以结合Spring的面向切面编程(AOP)功能,为Bean创建代理,实现横切关注点。 ...

    spring5.0.2中文官网文档

    Spring通过容器来创建、配置和管理这些Bean。Bean的定义可以被继承,允许子Bean继承父Bean的配置信息。而Bean的作用域描述了Bean的生命周期及其可见性,例如singleton(单例)、prototype(原型)等。 Spring还提供...

    SpringBoot 获取spring bean方式.rar

    在Spring框架中,Bean是一个由Spring容器管理的对象,通常代表应用中的业务组件或服务。Spring会负责Bean的创建、初始化、装配以及销毁等生命周期管理。 1. **`@Autowired`注解** `@Autowired`是Spring提供的一个...

    spring 代码1

    Bean是由Spring容器创建、初始化、装配并管理的对象。它们可以通过XML、Java注解或基于Java的配置进行定义。 5. **XML配置**:尽管现在更倾向于使用Java注解或Java配置,但XML仍然是Spring早期版本中配置Bean的常见...

    Spring中文API帮助文档

    2. **Bean工厂(Bean Factory)与ApplicationContext**:Bean Factory是Spring容器的基本实现,而ApplicationContext在Bean Factory的基础上添加了更多企业级服务,如消息源、应用事件和国际化支持。 3. **AOP**:...

    Spring5.0中文开发手册

    通过Spring IoC容器,可以将对象的创建、配置和组装的责任从应用程序代码中分离出来。 - **3.2 容器概述** - **3.2.1 配置元数据** - Spring IoC容器使用配置元数据来了解如何创建和配置bean。这些元数据可以是...

    Spring5 实战 第三章3.1代码

    通过使用注解(如@Autowired)或XML配置,Spring容器能够自动地为对象注入所需的依赖,这极大地提高了代码的灵活性和可测试性。 在Spring 5中,对Java 8及更高版本的支持得到了强化。这意味着你可以充分利用Java 8...

    spring源码代码

    Spring 的核心特性之一是依赖注入,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是在代码中硬编码。这提高了代码的可测试性和可维护性,因为对象的创建和组装过程被解耦。 2. **Bean 容器(Bean ...

    spring framewok 4参考文档

    而控制反转则是一种设计模式,通过容器来管理对象的生命周期以及对象间的关系,从而将对象创建和使用的责任从应用代码转移给Spring容器。 ### Spring Framework 4.x新特性 #### Spring Framework 4.0 4.0版本中,...

    一段Spring代码引起的调用绑定总结

    标题中的“一段Spring代码引起的调用绑定总结”指的是在使用Spring框架进行开发时,由于代码编写或配置不当,可能会遇到一些调用绑定的问题。这些问题通常涉及到依赖注入、AOP(面向切面编程)以及方法调用的上下文...

    精通spring源代码精通spring源代码

    1. **IoC(Inversion of Control)容器**:Spring的核心在于它的依赖注入(DI)机制,它通过反转控制权,将对象的创建和管理交由IoC容器处理。开发者只需定义对象及其依赖关系,容器负责实例化、装配和管理这些对象...

    Spring源代码解析

    在源代码中,`BeanFactory`和`ApplicationContext`是IoC容器的主要接口,它们负责加载配置,创建和管理bean。 Spring的AOP模块则提供了声明式事务管理、日志记录、性能监控等功能。在源代码中,`Advisor`、`...

Global site tag (gtag.js) - Google Analytics