Java Bean介绍与配置
Posted imreW
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
Bean 注解(Annotation)配置- Bean作用域与生命周期回调方法配置
Spring 系列教程
- Spring 框架介绍
- Spring 框架模块
- Spring开发环境搭建(Eclipse)
- 创建一个简单的Spring应用
- Spring 控制反转容器(Inversion of Control – IOC)
- 理解依赖注入(DI – Dependency Injection)
- Bean XML 配置(1)- 通过XML配置加载Bean
- Bean XML 配置(2)- Bean作用域与生命周期回调方法配置
- Bean XML 配置(3)- 依赖注入配置
- Bean XML 配置(4)- 自动装配
- Bean 注解(Annotation)配置(1)- 通过注解加载Bean
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
- Bean 注解(Annotation)配置(3)- 依赖注入配置
- Bean Java配置
- Spring 面向切面编程(AOP)
- Spring 事件(1)- 内置事件
- Spring 事件(2)- 自定义事件
在Bean XML 配置(2)- Bean作用域与生命周期回调方法配置中,介绍了使用XML配置Bean作用域与生命周期回调方法。本文介绍使用注解方式配置 Bean作用域与生命周期回调方法。
Bean作用域
spring中创建bean时,可以指定作用域。作用域有以下5种类型:
单例(singleton)
默认作用域,一个spring容器中只有Bean的一个实例。原型(prototype)
每次获取Bean时生成一个新的实例。请求(request)
作用域是单个http请求,单个http请求只有Bean的一个实例。一旦请求完成,bean实例将被销毁。会话(session)
作用域是单个会话,单个会话只有Bean的一个实例。一旦会话结束,bean实例将被销毁。全局会话(global-session)
在Portlet应用程序中使用,每个全局会话只有Bean的一个实例。普通Servlet应用中与会话作用域无区别。
Bean的作用域用注解方式设置,可以用@Scope
注解。
示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype") // 设置作用域
public class App
// ...
使用注解指定初始化回调方法与销毁回调方法
Spring容器负责管理Bean的生命周期,如下所示:
- 创建bean实例
- 设置bean的属性值
- 调用初始化回调方法
- 使用Bean
- 调用销毁回调方法
- 销毁Bean
Bean在创建时,需要执行一些资源(数据库、套接字、文件)申请等初始化工作,可以在Bean的初始化回调方法中处理,此方法由Spring容器调用。
同样Bean在销毁时,需要执行一些资源(数据库、套接字、文件)申请等销毁工作,可以在Bean的销毁回调方法中处理,此方法由Spring容器调用。
初始化回调方法与销毁回调方法可通过下面的注解指定:
@PostConstruct
- 此注解指定初始化回调方法@PreDestroy
- 此注解指定销毁回调方法
示例:
package com.qikegu.demo;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class App
// ...
@PostConstruct
public void init()
System.out.println("初始化...");
@PreDestroy
public void close()
System.out.println("销毁...");
// ...
以上是关于Java Bean介绍与配置的主要内容,如果未能解决你的问题,请参考以下文章
Bean 注解(Annotation)配置- Bean作用域与生命周期回调方法配置