1.使用外部属性文件配置Bean

在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离。Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 变量,Spring 2.5 之后,可通过 <context:property-placeholder> 元素简化。

示例:在外部属性文件中进行数据库的连接配置。

配置文件beans-properties.xml中进行配置:

  1. <!--导入属性文件-->
    <context:property-placeholder location="classpath:db.properties"/>
  2. <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--${var} var要与外部属性文件中的key一致-->
  3. <property name="user" value="${user}"></property>
  4. <property name="password" value="${password}"></property>
  5. <property name="jdbcUrl" value="${jdbcUrl}"></property>
  6. <property name="driverClass" value="${driverClass}"></property>
  7. </bean>

外部属性文件db.properties文件内容:

  1. user=root
  2. password=0404
  3. jdbcUrl=jdbc:mysql://localhost:3303/extra
  4. driverClass=com.mysql.jdbc.Driver

2.Spring表达式语言SpEL

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL。它 为 bean 的属性进行动态赋值提供了便利。

通过 SpEL 可以实现:

  • 通过 bean 的 id 对 bean 进行引用
  • 调用方法以及引用对象中的属性
  • 计算表达式的值
  • 正则表达式的匹配

示例代码:

Address.java

  1. package com.java.spring.SpEL;
  2.  
  3. public class Address {
  4. private String city;
  5. private String street;
  6. public String getCity() {
  7. return city;
  8. }
  9. public void setCity(String city) {
  10. this.city = city;
  11. }
  12. public String getStreet() {
  13. return street;
  14. }
  15. public void setStreet(String street) {
  16. this.street = street;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Address [city=" + city + ", street=" + street + "]";
  21. }
  22. }

Car.java

  1. package com.java.spring.SpEL;
  2.  
  3. public class Car {
  4.  
  5. private String brand;
  6. private double price;
  7. private String tyrePrimeter;
  8. public String getBrand() {
  9. return brand;
  10. }
  11. public void setBrand(String brand) {
  12. this.brand = brand;
  13. }
  14. public double getPrice() {
  15. return price;
  16. }
  17. public void setPrice(double price) {
  18. this.price = price;
  19. }
  20. public String getTyrePrimeter() {
  21. return tyrePrimeter;
  22. }
  23. public void setTyrePrimeter(String tyrePrimeter) {
  24. this.tyrePrimeter = tyrePrimeter;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Car [brand=" + brand + ", price=" + price + ", tyrePrimeter=" + tyrePrimeter + "]";
  29. }
  30.  
  31. }

Person.java

  1. package com.java.spring.SpEL;
  2.  
  3. public class Person {
  4. private String name;
  5. private Car car;
  6. //引用Address的city属性
  7. private String city;
  8. private String info;
  9. public String getCity() {
  10. return city;
  11. }
  12. public void setCity(String city) {
  13. this.city = city;
  14. }
  15. public String getInfo() {
  16. return info;
  17. }
  18. public void setInfo(String info) {
  19. this.info = info;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public Car getCar() {
  28. return car;
  29. }
  30. public void setCar(Car car) {
  31. this.car = car;
  32. }
  33. @Override
  34. public String toString() {
  35. return "Person [name=" + name + ", car=" + car + ", city=" + city + ", info=" + info
  36. + "]";
  37. }
  38.  
  39. }

在xml中进行配置:(使用SpEL)

  1. <bean id="address" class="com.java.spring.SpEL.Address">
  2. <property name="city" value="上海"></property>
  3. <property name="street" value="南京路"></property>
  4. </bean>
  5. <bean id="car" class="com.java.spring.SpEL.Car">
  6. <property name="brand" value="Audi"></property>
  7. <property name="price" value="300000.0000"></property>
  8. <!-- 使用SpEL的T()调用一个类的静态方法 -->
  9. <property name="tyrePrimeter" value="#{(T(java.lang.Math).PI)*3}"></property>
  10. </bean>
  11. <bean id="person" class="com.java.spring.SpEL.Person">
  12. <property name="name" value="Tom"></property>
  13. <!-- 使用SpEL引用其他Bean -->
  14. <property name="car" value="#{car}"></property>
  15. <!-- 使用SpEL引用其他对象的属性 -->
  16. <property name="city" value="#{address.city}"></property>
  17. <!-- 在SpEL中使用运算符 -->
  18. <property name="info" value="#{car.price>300000.000?'金领':'白领'}"></property>
  19. </bean>

在主方法中实例化Bean:

  1. package com.java.spring.SpEL;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class Main {
  7. public static void main(String[] args){
  8. ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-SpEL.xml");
  9. Person person=(Person)ctx.getBean("person");
  10. System.out.println(person);
  11. }
  12. }

运行后输出:

  1. Person [name=Tom, car=Car [brand=Audi, price=300000.0, tyrePrimeter=9.42477796076938], city=上海, info=白领]

3.IOC 容器中 Bean 的生命周期方法

Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

  • 通过构造器或工厂方法创建 Bean 实例;
  • 为 Bean 的属性设置值和对其他 Bean 的引用;
  • 调用 Bean 的初始化方法;
  • Bean 可以使用了;
  • 当容器关闭时, 调用 Bean 的销毁方法;

在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。

示例代码:

Car.java

  1. package com.java.spring.Cycle;
  2.  
  3. public class Car {
    //1.通过构造器或工厂方法创建 Bean 实例;
  4. public Car(){
  5. System.out.println("Car's constructor...");
  6. }
  7. private String brand;
    //3.调用 Bean 的初始化方法;
  8. public void init(){
  9. System.out.println("Car's init method...");
  10. }
    //2.为 Bean 的属性设置值和对其他 Bean 的引用;
  11. public void setBrand(String brand){
  12. System.out.println("Car's setBrand method...");
  13. this.brand=brand;
  14. }
  15. public void destroy(){
  16. System.out.println("Car's destroy method...");
  17. }
  18. @Override
  19. public String toString() {
  20. return "Car [brand=" + brand + "]";
  21. }
  22. }

在xml中进行配置:

  1. <bean id="car" class="com.java.spring.Cycle.Car" init-method="init" destroy-method="destroy">
  2. <property name="brand" value="Audi"></property>
  3. </bean>

在主方法中实例化并且关闭IOC容器:

  1. public class Main {
  2. public static void main(String[] args){
  3. ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
    //4.Bean 可以使用了;
  4. Car car=(Car)ctx.getBean("car");
  5. System.out.println(car);
    //5.当容器关闭时, 调用 Bean 的销毁方法;
  6. ctx.close();
  7. }

运行后输出:

  1. Car's constructor...
  2. Car's setBrand method...
  3. Car's init method...
  4. Car [brand=Audi]
  5. Car's destroy method...

使用外部属性文件配置Bean以及Bean的生命周期方法的更多相关文章

  1. Spring 使用外部属性文件配置

    1.Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean的配置的部分内容 移到属性文件中.可以在Bean配置 ...

  2. Spring 应用外部属性文件 配置 context 错误

    在Spring配置文件中出现通配符的匹配很全面, 但无法找到元素 'context:property-placeholder' 的声明这个错误,其实主要是我们在引入命名空间时没有正确引入它的DTD解析 ...

  3. IoC容器-Bean管理XML方式(引入外部属性文件)

    IoC操作Bean管理(引入外部属性文件) 1,直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池依赖jar包 2,通过引入外部属性文件配置数据库连接池 (1)创建外部属性文件,pro ...

  4. Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...

  5. Spring - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配1.1 使用:只需在<bean>中使用autowire元素<bean id="student" class="com.kej ...

  6. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Spring(十):Spring配置Bean(三)Bean的作用域、使用外部属性文件

    Bean的作用域: 支持四种配置,分别是singleton,prototype,request,session. singleton 默认情况下在spring confinguration xml文件 ...

  8. Spring-Bean配置-使用外部属性文件(转)

    Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...

  9. spring4-2-bean配置-6-使用外部属性文件

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk0AAAFGCAIAAAD4tzxRAAAgAElEQVR4nO2d27HsOm+tOxWn4CeXAm ...

随机推荐

  1. mybatis的dao向mapper.xml传入多参数

    https://www.cnblogs.com/super-chao/p/7722411.html 如果两种不同类型的参数传入,parameterType可以不写,直接获取#{0},#{1}就可以传入 ...

  2. HTTP协议、HTTP协议原理分析

    百度百科中说明: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为 ...

  3. php 向二维数组中追加元素

    处理之前的数据: 处理后: //$consult 为往里插之前的数组 //把$arr的元素追加到$consult的最前面 $arr = []; $arr[0]['workplaceId'] = '0' ...

  4. ajax请求失败 chrome报错net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题原因

    项目框架 React.js + webpack + ES6 + JQuery 问题场景 ajax请求用户数据,服务器返回json格式,数据很可能会比较长,甚至达到几百kb. 问题描述 客户端ajax请 ...

  5. 尺寸单位em,rem,vh,vw

    这几天做demo,看了网上教程有用到尺寸单位vh,vw, 这些单位不是很熟悉,所以上网上找了些资料来认识了这些不认识的单位 1.em 在做手机端的时候经常会用到的做字体的尺寸单位 说白了 em就相当于 ...

  6. laydata 点击日期闪现

    因项目需求需要多个日期,然后点击日期就会出现闪现的情况,导致选择不了日期 html代码 <table class="form"> <tr> <th c ...

  7. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题

    问题:The permissions granted to user 'TOUCHPOINTMED\sshi' are insufficient for performing this operati ...

  8. http正向代理与反向代理

    转自:https://baijiahao.baidu.com/s?id=1566988836622068&wfr=spider&for=pc 一句话总结正向代理与反向代理的区别:正向代 ...

  9. Spring Boot 日志配置

    Spring Boot 日志配置 默认日志 Logback: 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很 ...

  10. android-zip解压缩方法

    /** * 解压缩文件到指定的目录. * * @param unZipfileName * 需要解压缩的文件(带路径) * @param mDestPath * 解压缩后存放的路径 **/ publi ...