首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动转换Spring Bean

自动转换Spring Bean
EN

Stack Overflow用户
提问于 2009-05-01 16:43:39
回答 6查看 16.5K关注 0票数 7

有没有办法将Spring bean自动转换为应用程序上下文XML中定义的类?我想避免把关于bean的类型信息放在两个地方……在xml配置文件中,也在代码中作为强制转换。

例如,给定以下配置文件

代码语言:javascript
复制
<bean id="bean-name" class="SimpleSpringBean"  scope="prototype">
    <property name="myValue" value="simple value"></property>
</bean>

我能否以避免直接将返回类型转换为SimpleStringBean的方式调用ApplicationContext.getBean("bean-name")。我知道我也可以调用ApplicationContext.getBean("bean-name", SimpleSpringBean.class)来避免强制转换本身,但是我仍然有两个地方的类型信息。

看起来Spring可以获取类信息(ApplicationContext.getType),或者通过从bean本身获取类型,但在没有程序员干预的情况下无法自动转换类型。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-01 17:11:06

我同意Sii的观点,你应该尽量避免调用getBean。只需将bean连接到依赖它们的类。

不过,如果您只有一个包含应用程序上下文的类,则可以提供如下所示的包装器泛型方法:

代码语言:javascript
复制
class MyContextHolder{
    ApplicationContext appContext;
    ......
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName)
    {
        return (T)appContext.getBean(beanName);
    }
}

然后,您可以在不强制转换的情况下调用它

代码语言:javascript
复制
MyClass mc = MyContextHolder.getBean("myClassBean");
票数 11
EN

Stack Overflow用户

发布于 2009-05-01 16:55:16

答案是,如果可能的话,您根本不应该使用ApplicationContext.getBean(),并忍受引导程序代码中必须使用的一个地方。(通常,您永远不需要在应用程序入口点之外使用getBean()。)

而且,您所要求的内容在Java语言中很可能根本不可能实现。强制转换是一种编译时特性,与运行时检查相结合。getBean()的返回类型在编译时必须是已知的。即使Spring可以确定对象的类型,它也不能在运行时更改自己的方法签名。

另一件事是,即使这是可能的,该功能也不会那么有用。因为Spring AOP是使用动态代理实现的,所以您几乎总是希望Spring为您提供bean实现的接口的实例(可以是AOP代理),而不是实现类的实例。

票数 4
EN

Stack Overflow用户

发布于 2009-05-01 18:58:33

我也使用的另一种方法是使用以下命令自动安装bootstrapping类:

代码语言:javascript
复制
public class Main {
    @Autowired FooFacade foo;
    @Autowired BarFacade bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("appCtx.xml");
        AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
        Object main = bf.createBean(Main.class, 
                                    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT,
                                    false);
        ((Main) main).run();
    }

    private void run() {
        foo.doBootstrapStuff();
        bar.doMoreBootstrapStuff();
    }
}

(从内存中完成的代码。可能只有当您将Spring context配置为处理连接注释时才能工作,在这种情况下,为foobar设置应该可以工作。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/812178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档