0

当我需要使用 Property Place Holder 时,我只是在 spring_config.xml 中定义了一个 bean,如下所示,没有在 java 代码中对这个 bean 做任何事情,spring 怎么会知道呢?

    <bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
        p:location="spring_test/spring.properties"></bean> 

另一个令人困惑的部分是相似的:我在 spring_config.xml 中定义了两个 bean,即 SqlSessionFactoryBean 和 MapperFactoryBean,spring 如何实现 MapperFactoryBean 就像我的 DAO 的代理一样,而无需编写任何 java 代码?

有没有关于xml解析机制或相关内容的文章?非常感谢!

4

1 回答 1

1

您需要了解 Java 反射。Java 反射可以在运行时检查类、接口、字段和方法,而无需在编译时知道类、方法等的名称。也可以使用反射实例化新对象、调用方法和获取/设置字段值。下面是一个简单的例子。

 package com.example;

    public class Emplyoee {    
        private String name;
        public Emplyoee() {
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        } 

        public static void main(String args[]) {
            String className = "com.example.Emplyoee";
            try {
                 //finds class, casts Emplyoee class
                  Class<Emplyoee> klass = ((Class<Emplyoee>) Class.forName(className ));
                 //instantiate new objects,notice Emplyoee class
                 Emplyoee theNewObject = klass.newInstance();
                 //set value 
                 theNewObject.setName("john");
                 //calls "name" by getter method,and prints "john"
                 System.out.println(theNewObject.getName());

            } catch (ClassNotFoundException e) {
                 e.printStackTrace();
            } catch (InstantiationException e) {
                 e.printStackTrace();
            } catch (IllegalAccessException e) {
                 e.printStackTrace();
            }
       }
    }

Spring容器会通过“forName”方法找到“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”类,并实例化“PropertyPlaceholderConfigurer”类。

于 2013-01-28T01:57:03.203 回答