0

次の方法でBeanにアクセスしようとすると

ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("factoryMethodDemo.xml");
    System.out.println(context.getBean("bean2",BeanLifeCycle.class));
    System.out.println(context.getBean("bean",FactoryMethodDemo.class));
    context.close();

ここで BeanLifeCycle.class は、BeanNameAware...DisposableBean などのすべてのライフサイクル インターフェイスを実装します。FactoryMethodDemo.class は単純な Bean です。

FactoryMethodDemo.java

        package com.demo;

    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class FactoryMethodDemo {
        private String message;

        public FactoryMethodDemo() {
        }

        public void setMessage(String message) {
            System.out.println("setMessage Called");
            this.message = message;
        }

        public void defaultInit() {
            System.out.println("defaultInit");

        }

        public static void main(String[] args) {
            ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("factoryMethodDemo.xml");
            System.out.println(context.getBean("bean2",BeanLifeCycle.class));
            System.out.println(context.getBean("&bean",FactoryMethodDemo.class));
            context.close();
        }
    }

BeanLifeCycle.java

        package com.demo;

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;

    public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor, InitializingBean, DisposableBean {

        private String property;

        public void setProperty(String property) {
            System.out.println("setProperty");
        }

        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("setBeanFactory");
        }

        @Override
        public void setBeanName(String beanName) {
            System.out.println("setBeanName");
        }

        @Override
        public void setApplicationContext(ApplicationContext arg0) throws BeansException {
            System.out.println("setApplicationContext");

        }

        @Override
        public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
            System.out.println("postProcessAfterInitialization");
            return new Object();
        }

        @Override
        public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
            System.out.println("postProcessBeforeInitialization");
            return new Object();
        }

        @Override
        public void afterPropertiesSet() throws Exception {
            // THis is treated as init method
            System.out.println("afterPropertiesSet");
        }

        @Override
        public void destroy() throws Exception {
            System.out.println("destroy");
        }


    }

factoryMethodDemo.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans  xmlns="http://www.springframework.org/schema/beans" x        mlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="bean" class="com.demo.FactoryMethodDemo">
    <property name="message" value="message"></property>
    </bean>
    <bean id="bean2" class="com.demo.BeanLifeCycle">
    <property name="property" value="property"></property></bean>
    </beans>

次の例外をスローします

スレッド「メイン」org.springframework.beans.factory.BeanNotOfRequiredTypeException での例外:「bean」という名前の Bean は [com.demo.FactoryMethodDemo] 型である必要がありますが、実際には [java.lang.Object] 型でした

明らかに、FactoryMethodDemo の代わりにオブジェクト型が返されます。だれかが、このような例外を引き起こすために舞台裏で何が起こっているかを説明してください。お時間をいただきありがとうございます。

4

1 に答える 1

1

com.demo.FactoryMethodDemoインターフェイスを実装すると思いFactoryBeanます:

これは、Bean がFactoryMethodDemo(id を持つ) 別の Bean を作成する責任があるため、Bean がアプリケーションコンテキストでルックアップに使用できないことを意味しますbean

の実装を見ると、おそらくid で利用可能な Bean のインスタンスを返す のFactoryMethodDemo実装があることがわかります。getObjectbean

「ファクトリ Bean」は通常の Bean とは異なるため、getBean(String beanId, Class beanType)登録されないため、メソッドを使用して参照することはできません。ただし、次のことができるはずです。

context.getBean("&bean");

これは、Bean「bean」を作成した「factory」を返します。

Spring リファレンス ドキュメントも参照してください。

于 2012-04-23T11:23:19.470 に答える