Java Bean介绍与配置
(一)Java Bean介绍
1.java Bean的介绍
在Java中,有很多class
的定义都符合这样的规范:
- 若干
private
实例字段; - 通过
public
方法来读写实例字段。
例如:
public class Person { private String name; private int age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } }
如果读写方法符合以下这种命名规范:
// 读方法: public Type getXyz() // 写方法: public void setXyz(Type value)
那么这种class
被称为JavaBean
:
上面的字段是xyz
,那么读写方法名分别以get
和set
开头,并且后接大写字母开头的字段名Xyz
,因此两个读写方法名分别是getXyz()
和setXyz()
。
boolean
字段比较特殊,它的读方法一般命名为isXyz()
:
// 读方法: public boolean isChild() // 写方法: public void setChild(boolean value)
我们通常把一组对应的读方法(getter
)和写方法(setter
)称为属性(property
)。例如,name
属性
- 对应的读方法是
String getName()
- 对应的写方法是
setName(String)
getter
的属性称为只读属性(read-only),例如,定义一个age只读属性:- 对应的读方法是
int getAge()
- 无对应的写方法
setAge(int)
类似的,只有setter
的属性称为只写属性(write-only)。
很明显,只读属性很常见,只写属性不常见。
属性只需要定义getter
和setter
方法,不一定需要对应的字段。例如,child
只读属性定义如下:
public class Person { private String name; private int age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public boolean isChild() { return age <= 6; } }
可以看出,getter
和setter
也是一种数据封装的方法。
2.JavaBean的作用
JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。
getter
和setter
。例如,在Eclipse中,先输入以下代码:public class Person { private String name; private int age; }
然后,点击右键,在弹出的菜单中选择“Source”,“Generate Getters and Setters”,在弹出的对话框中选中需要生成getter
和setter
方法的字段,点击确定即可由IDE自动完成所有方法代码。
(二)Spring 配置 Bean (XML 方式)
1.基于 XML 的配置
applicationContext.xml
文件,声明命名空间来配置 Java Bean,XML 基本格式如下:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" > </beans>
2.示例
声明一个 Person 类、Car 类,并且生成 getter,setter 方法。
package com.test.helloworld; public class Person { private String name; private String age; private Car car; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Person() { System.out.println("无参构造函数"); } public Person(String name, String age, Car car) { super(); this.name = name; this.age = age; this.car = car; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
toString()方法在Object类里定义的,其返回值类型为String类型,返回类名和它的引用地址
Car.java
package com.test.helloworld; public class Car { private String brand; private Double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Car [brand=" + brand + ", price=" + price + "]"; } }
(1)依赖注入:属性注入
也就是 setter 注入,通过 setter 方法进行属性注入。
再 xml 文件的 beans 标签中添加 bean 标签,书写格式如下
<bean id="person" class="com.test.helloworld.Person"> <property name="name" value="小明"></property> <property name="age" value="20"></property> <property name="car" ref="car1"></property> </bean> <bean id="car1" class="com.test.helloworld.Car"> <property name="brand" value="BMW"></property> <property name="price" value="350000"></property> </bean>
其中:
- bean : 表示配置一个 bean,这个 bean 会在 IOC 容器启动的时候,被 IOC 容器加载(实例化),并且在 IOC 容器中管理这个 bean
- id : bean的名称,是一个唯一的名称
- class : 这个bean对应的类型的全类名
- property : 这个标签表示给 IOC 容器中管理的这个 bean 设置属性
- name : 属性名 ( 对应的是JavaBean风格的属性名 , 也就是 setter 方法 )
- value 或者 value 标签 : 需要设置的属性值
- ref 或者 ref 标签 :表示引用其他的bean
(2)依赖注入:构造注入
在没有属性对应的 getter 和 setter 方法,我们的字段往往是采用有参构造函数初始化的,同理,这里也可以通过构造函数注入
<bean id="person" class="com.test.helloworld.Person"> <constructor-arg value="小王"></constructor-arg> <constructor-arg value="18"></constructor-arg> <constructor-arg ref="car1"></constructor-arg> </bean> <bean id="car1" class="com.test.helloworld.Car"> <property name="brand" value="BMW"></property> <property name="price" value="350000"></property> </bean>
参数顺序
这里是按照参数的顺序, 我们也可以通过设置添加 index 属性来设置参数顺序。
<bean id="person" class="com.test.helloworld.Person"> <constructor-arg value="18" index="0" ></constructor-arg> <constructor-arg value="小王" index="1"></constructor-arg> <constructor-arg ref="car1" index="3"></constructor-arg> </bean> <bean id="car1" class="com.test.helloworld.Car"> <property name="brand" value="BMW"></property> <property name="price" value="350000"></property> </bean>
- index : 通过 index 属性可以设置构造注入传入参数的顺序,从 0 开始到参数个数 -1 结束
参数类型
还可以通过设置参数(添加 type 属性)的类型,来匹配相应的构造函数,实例化对象。
<bean id="person" class="com.test.helloworld.Person"> <constructor-arg value="18" index="0" type="java.lang.String" ></constructor-arg> <constructor-arg value="小王" index="1" type="java.lang.String"></constructor-arg> <constructor-arg ref="car1" index="3"></constructor-arg> </bean> <bean id="car1" class="com.test.helloworld.Car"> <property name="brand" value="BMW"></property> <property name="price" value="350000"></property> </bean>
3.使用
通过生成 ApplicationContext 对象(IOC 容器)来获得 bean 对象。
//1 启动 SpringIOC 容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //2 从 IOC 容器中获取 bean Person person = (Person)applicationContext.getBean("person"); //3 使用 bean System.out.println(person);
其中,XML 文件放在 src 的resources下。
- Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了