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

前言

前面在使用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()方法。这里就不再赘述。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值