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&characterEncoding=utf8&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等多种作用域,可以通过配置指定。