5.4. Bean处理和BeanWrapper - Spring Framework reference 2.0.5 参考手册中文版
spring中的BeanWrapper,Bean Factory,ApplicationContext
Spring 学习 (二)__BeanWrapper及其实现
BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能。不仅如此,BeanWrapper还支持嵌套属性,你可以不受嵌套深度限制对子属性的值进行设置。所以,BeanWrapper无需任何辅助代码就可以支持标准JavaBean的PropertyChangeListeners和VetoableChangeListeners。除此之外,BeanWrapper还提供了设置索引属性的支持。通常情况下,我们不在应用程序中直接使用BeanWrapper而是使用DataBinder 和BeanFactory。
BeanWrapper这个名字本身就暗示了它的功能:封装了一个bean的行为,诸如设置和获取属性值等。
设置和获取属性值以及嵌套属性
设置和获取属性可以通过使用重载的setPropertyValue(s)
和getPropertyValue(s)
方法来完成。在Spring自带的JavaDoc中对它们有详细的描述。值得一提的是,在这其中存在一些针对对象属性的潜在约定规则。下面是一些例子:
表 5.1. 属性示例
name |
指向属性name,与getName() 或 isName() 和 setName()相对应。 |
account.name |
指向属性account的嵌套属性name,与之对应的是getAccount().setName()和getAccount().getName() |
account[2] |
指向索引属性account的第三个元素,索引属性可能是一个数组(array),列表(list)或其它天然有序的容器。 |
account[COMPANYNAME] |
指向一个Map实体account中以COMPANYNAME作为键值(key)所对应的值 |
例子1:
public interface Action { public String execute(); } public class UpperAction implements Action { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String execute() { return (msg.toUpperCase()); } }
设置值方法1 (JAVA反射):
我们知道,如果动态设置一个对象属性,可以借助Java的Reflection机制完成:
try { Class cls = Class.forName("net.sg.spring.service.UpperAction"); Object obj = cls.newInstance(); Method method = cls.getMethod("setMsg", new Class[]{String.class}); method.invoke(obj, new Object[]{"hello"}); System.out.println(((UpperAction) obj).execute()); } catch (Exception e) {}
设置值方法2( BeanWrapper方式):
try { Class cls = Class.forName("net.sg.spring.service.UpperAction"); Object obj = cls.newInstance(); BeanWrapper beanWrapper = new BeanWrapperImpl(obj); beanWrapper.setPropertyValue("msg","hello"); System.out.println(beanWrapper.getPropertyValue("msg")); System.out.println(((UpperAction)obj).getMsg()); } catch (Exception e) {}
例子2:
public class Employee { private float salary; public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }
public class Company { private String name; private Employee managingDirector; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Employee getManagingDirector() { return this.managingDirector; } public void setManagingDirector(Employee managingDirector) { this.managingDirector = managingDirector; } }
BeanWrapper company = BeanWrapperImpl(new Company()); // setting the company name.. company.setPropertyValue("name", "Some Company Inc."); // ... can also be done like this: PropertyValue value = new PropertyValue("name", "Some Company Inc."); company.setPropertyValue(value); // ok, let's create the director and tie it to the company: BeanWrapper jim = BeanWrapperImpl(new Employee()); jim.setPropertyValue("name", "Jim Stravinsky"); company.setPropertyValue("managingDirector", jim.getWrappedInstance()); // retrieving the salary of the managingDirector through the company Float salary = (Float) company.getPropertyValue("managingDirector.salary");
.
相关推荐
- **访问和修改属性值**:使用`Field`的`get(Object obj)`和`set(Object obj, Object value)`方法可以读取和设置Bean实例的属性值。 - **遍历getter和setter**:`Class.getMethod(String name, Class<?>... ...
通过BeanWrapper,我们可以获取到Bean的PropertyEditor,用于类型转换,然后设置属性值。然而,当类型不匹配时,BeanWrapper会抛出`org.springframework.beans.TypeMismatchException`异常。 2. **DataBinder实现**...
它提供了一个统一的接口,用于获取和设置Bean的属性值,无论这些属性是否嵌套在其他Bean中。 1. **BeanWrapper的实现**: - BeanWrapper的主要实现类为`BeanWrapperImpl`,它通过反射机制实现了对Bean属性的操作。...
- **setter方法**:用于设置JavaBean的属性值,如`public void setName(String name)`。 3. **序列化**: - JavaBean可以实现`Serializable`接口,使其支持数据持久化,方便在内存、文件或网络间传输。 4. **...
"setter方式"是DI的一种实现方式,它通过调用对象的setter方法来设置其属性值。这篇博客可能详细介绍了如何使用setter注入向bean中注入各种类型的值,如基本类型、字符串、其他bean、集合类型等。 1. **基本类型的...
- **设置 Bean 的属性和合作者**:可以在 Bean 定义中指定其属性值和其他依赖的 Bean。 - **深入 Bean 属性和构造函数参数**:可以使用构造函数注入来传递参数,也可以使用 setter 方法注入来设置属性。 - **方法...
`BeanWrapper`接口提供了对JavaBean属性的标准化访问,通过它可以在运行时动态地获取或设置bean的属性值,无需关心具体的JavaBean类型。这对于实现IoC和AOP等高级功能至关重要,因为它提供了对对象状态的统一访问点...
3. **BeanDefinition**:这个接口代表了bean的元数据,包含bean的类名、初始化方法、属性值、依赖关系等信息。这些信息被用来实例化和配置bean。 4. **PropertyEditor**:Spring利用PropertyEditor来处理bean属性的...
BeanWrapper类用于操作JavaBean属性,包括获取和设置属性值以及属性类型转换。Spring类型转换系统提供了一个全面的类型转换服务,支持各种类型之间的转换。Spring还提供了一套标准的日期和时间格式化配置。 最后,...
- **BeanWrapper**:提供了一种统一的接口来访问和操作Java Bean属性,可以方便地获取和设置Bean的属性值。 - **BeanFactory**:是最基本的容器接口,负责实例化、定位和配置应用程序中的对象。它是Spring IoC容器...
3. **BeanUtils.class**:这是Apache Commons BeanUtils库中的一个类,提供了许多实用方法,用于操作JavaBean属性,如复制属性、设置和获取属性值等。 4. **PropertyEditorRegistrySupport.class**:这是Spring框架...
SpEL可以用于bean定义中,为bean属性设置值,也可以在运行时查询和操作对象属性。 Spring AOP(面向切面编程)是Spring的一个重要组件,它允许开发者将横切关注点(例如日志、安全等)与业务逻辑分离,从而使得代码...
- BeanWrapper,一个包装了JavaBean的对象,提供了设置/获取属性等操作; - BeanFactory,负责管理对象的创建和DI,是Spring中Bean的容器; - ApplicationContext,扩展了BeanFactory,支持国际化和事件传播; -...
* 获取属性中为空的字段 * * @param target * @return */ private static String[] getNullField(Object target) { BeanWrapper beanWrapper = new BeanWrapperImpl(target); PropertyDescriptor[] ...
BeanWrapper是Spring框架中用于操作JavaBeans属性的标准接口,它提供了统一的属性访问和修改机制,使得开发者可以独立于特定的JavaBean实现来操作对象的属性。 **BeanFactory** BeanFactory是Spring容器的基本形态...
它提供了统一的方法来读取和设置Bean的属性值,简化了Bean的处理流程。 #### 20. 元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,cascade属性应该取什么值? 为了使Hibernate级联保存集合中的...