Spring框架配置扩展

1.1    配置数据源

第7章使用Spring框架整合MyBatis框架后,我们把数据源的相关配置从MyBatis配置文件转移到了Spring配置文件中。在实际开发中,数据源还有一些其他配置方式。

1.1.1    使用properties文件配置数据源

使用properties文件配置数据源时,可以把数据源的相关配置信息单独放到properties文件中进行维护。配置代码如示例1所示。

示例1

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai

jdbc.username=root

jdbc.password=123456

1.1.2    使用JNDI配置数据源

如果应用程序所部署的服务器(如Tomcat、WebLogic等)提供了数据源服务,应用程序也可以直接使用这些数据源。服务器数据源是使用JNDI方式,Spring框架为此专门提供了引用JNDI资源的JndiObjectFactoryBean类供开发者使用。若使用JNDI方式配置数据源,则需要把数据源信息配置到应用服务器上。以Tomcat为例,首先,需要把数据库驱动文件放到Tomcat的lib目录下;然后,把数据源信息配置到Tomcat的conf目录下的context.xml文件中,并修改Spring配置文件为通过JNDI方式配置数据源。具体配置信息如示例3所示。

示例3

<Context>

    <Resource

        name="jdbc/cvs_db"

        auth="Container"

        type="javax.sql.DataSource"

        maxTotal="100"

        maxIdle="30"

        maxWaitMillis="10000"

        username="root"

        password="123456"

        driverClassName="com.mysql.cj.jdbc.Driver"

        url="jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>

</Context>

Spring配置文件:

<!-- 通过JNDI配置DataSource -->

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

    <!-- 通过jndiName指定引用的JDNI数据源名称 -->

    <property name="jndiName">

        <value>java:comp/env/jdbc/cvs_db

    </property>

</bean>

<!-- 省略其他代码 -->

1.2    拆分Spring配置文件

如果选择使用XML配置文件的方式开发Spring项目,则当项目规模越来越大时,项目中的Bean也越来越多,配置文件将变得越来越臃肿,可读性和维护性都会降低;多人修改同一配置文件时也容易发生冲突,影响开发效率。因此,Spring框架提供了可以将配置文件拆分处理的功能,可以将一个大的配置文件分解成多个小配置文件。

1.3    Bean的自动装配

学习@Autowired或@Resource注解的时候同学们已经对Spring框架的自动装配功能有了一定的了解。Spring框架的自动装配是指在没有显式指定所依赖的Bean组件id的情况下,可以自动地将与属性类型相符的Bean注入相应属性的功能(对于@Resource注解而言,还会尝试id和属性名相符的情况),这在很大程度上简化了配置。Spring框架除支持注解方式的自动装配功能外,还支持使用XML配置文件方式实现Bean的自动装配。

1.4    Bean的作用域

1.4.1    什么是Bean的作用域

在Spring框架中定义Bean,除可以创建Bean实例并对Bean的属性进行注入外,还可以为所定义的Bean指定一个作用域,这个作用域的取值决定了Spring框架创建该组件实例的策略,进而影响程序的运行效率和数据安全。在Spring2.0及之后的版本中,Bean的作用域被划分为以下五种。

    ▶    singleton:默认值。以单例模式创建Bean的实例,即容器中该Bean的实例只会被创建一个。

    ▶    prototype:每次从容器中获取Bean时,都会创建一个新的实例。

    ▶    request:用于Web应用环境,针对每次HTTP请求都会创建一个实例。

    ▶    session:用于Web应用环境,同一个会话共享同一个实例,不同的会话使用不同的实例。

    ▶    global session:仅在Portlet的Web应用中使用,同一个全局会话共享一个实例。对于非Portlet环境,等同于session。

singleton是默认的作用域,表示在默认情况下Spring框架为每个Bean仅创建一个实例,采用这种方式可以大大减少创建对象的开销,提高运行效率。但是,对于存在线程安全问题的组件,可以使用prototype作用域代替单例模式,关键代码如示例1所示。

示例1

<!-- 配置DAO -->

<bean id="sysUserMapper" class="com.bdqn.mapper.impl.SysUserMapperImpl" autowire="byType" scope="singleton"/>

<!-- 配置业务Bean -->

<bean id="sysUserService" class="com.bdqn.service.SysUserServiceImpl" autowire="byName" scope="prototype"/>

1.4.2    使用注解指定Bean的作用域

在当前的企业管理系统开发中,更多情况下是使用注解方式开发项目。使用注解方式配置Bean的作用域更加方便,代码如示例2所示。

示例2

import org.springframework.context.annotation.Scope;

/**

* 用户模块业务层实现

*/

@Scope("prototype")

@Service

public class SysUserServiceImpl implements SysUserService {

      ······   //业务代码略

}

本章总结

◎    数据库配置信息可以放在properties文件中单独维护。

◎    Spring框架可以使用PropertySourcesPlaceholderConfigurer加载properties文件,实现更灵活地数据源配置。

◎    Spring框架可以从服务器环境中获取JNDI资源。

◎    Spring框架提供了自动装配(autowire)功能,常用方式包括byName和byType。

◎    Spring框架支持同时使用多个配置文件,可以通过ClassPathXmlApplicationContext类的构造方法加载多个配置文件,也可以在配置文件中通过import标签引入其他配置文件。

◎    Spring框架中的Bean拥有singleton、prototype、request、session、global session等多种作用域,可以通过配置指定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容