Spring配置文件关于bean的相关属性

发布于:2024-12-18 ⋅ 阅读:(63) ⋅ 点赞:(0)

前言

前面在使用spring容器的时候使用了xml文件进行配置,关于bean的属性有以下几种:

属性名 作用
class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类
name/id 这个属性指定唯一的 bean 标识符
scope 指定由特定的 bean 定义创建的对象的作用域
constructor-arg 用来注入依赖关系
properties 用来注入依赖关系
autowiring mode 用来注入依赖关系
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例
initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法
destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法

id/name属性

    id为bean的唯一标识,但在定义bean的时候也可以不需要写id属性,可以通过class属性的值作为key获取到bean对象:

<bean class="com.cc.service.UserService"></bean>

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
         UserService test = (UserService) a.getBean("com.cc.service.UserService");
         test.a();
    }
}

    如果有id,就不能通过这种方式获取,会报NoSuchBeanDefinitionException的错误:

 

    当<baen>标签内没有id属性时,也可以根据name属性获取对象:

<bean name="text" class="com.cc.service.UserService"></bean>

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
         UserService test = (UserService) a.getBean("text");
         test.a();
    }
}

    如果有多个相同的name值,那么会报BeanDefinitionParsingException的错,同样,如果有重复的id也会报相同的错误:

<bean name="text" class="com.cc.service.UserService"></bean>
<bean name="text" class="com.cc.entity.User"></bean>

 

 scope属性

    可以通过scope来制定bean的作用域,取值如下:

作用域 描述
singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例的形式存在、默认值
prototype 每次从容器中调用Bean时,都会返回一个新的实例,每次调用getBean时,相当于执行new
request      每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationcontext环境
session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationcontext环境
global-session 一般用于Portlet应用环境,该作用域仅适用于WebApplicationcontext环境

先将作用域设置为singleton

<bean id="text" class="com.cc.service.UserService" scope="singleton"></bean>

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
        Object a1 = a.getBean("text");
        Object a2 = a.getBean("text");
        System.out.println(a1);
        System.out.println(a2);

    }
}

可以看到a1和a2的地址相同,说明它们为同一个对象。

接下来将作用范围改成prototype

初始化方法和销毁方法

同样,Bean也有关于生命周期的方法,分别是init-methoddestroy-method

<bean id="text" class="com.cc.service.UserService" scope="singleton" init-method="init" destroy-method="destroy"></bean>

public class UserService {
    public void a(){
        System.out.println("........");
    }

    public UserService() {
        System.out.println("类对象的创建");
    }
    private void init() {
        System.out.println("初始化方法...");
    }

    private void destroy() {
        System.out.println("销毁方法...");
    }
}
public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
        UserService text = (UserService) a.getBean("text");
        a.close();
    }
}

注:销毁方法只有在scope为singleton有效,多例模式下通常不会调用销毁方法!


在对象创建完毕之后想做一些操作的方式除了写init-method方法外,还可以实现InitializingBean接口,重写afterPropertiesSet()方法。这里就不再赘述。