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,那么读写方法名分别以getset开头,并且后接大写字母开头的字段名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)

很明显,只读属性很常见,只写属性不常见。

属性只需要定义gettersetter方法,不一定需要对应的字段。例如,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;
    

可以看出,gettersetter也是一种数据封装的方法。

2.JavaBean的作用

JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。

通过IDE,可以快速生成gettersetter。例如,在Eclipse中,先输入以下代码:
public class Person 
    private String name;
    private int age;

然后,点击右键,在弹出的菜单中选择“Source”,“Generate Getters and Setters”,在弹出的对话框中选中需要生成gettersetter方法的字段,点击确定即可由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 方法。

Person. java
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 系列教程


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的生命周期,如下所示:

  1. 创建bean实例
  2. 设置bean的属性值
  3. 调用初始化回调方法
  4. 使用Bean
  5. 调用销毁回调方法
  6. 销毁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介绍与配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring装配bean(在java中进行显式配置)

第2章—装配Bean—通过java代码装配bean

Bean 注解(Annotation)配置- Bean作用域与生命周期回调方法配置

java怎么配置spring的bean

Spring IOC官方文档学习笔记之基于Java的容器配置

Java技术篇!阿里java面试宝典