Spring配置补充
- 一、灵活配置DataSource
实现Spring和MyBatis整合
- 使用属性文件配置数据源
在使用Spring整合MyBatis时,在XML配置中可以将数据库连接信息。为了使DataSource的可配置性更强,便于维护。Spring也支持从属性文件中获取信息来进行数据源配置。使用Spring提供的PropertyPlaceholderConfigurer类可以假装属性文件。在Spring配置文件中可以采用${...}的方式引用属性文件中的键值对。读取属性文件配置DataSource
mybatis-spring.版本号.jar、spring-beans.版本号.jar等相关JAR包
<!--引入properties文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
注意:${}中对应属性文件的键值,如果不小心输入括号可能导致报错
- 使用JNDI数据源
如果应用部署在高性能的应用服务器(如Tomcat、WebLogic等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI方式供使用者调用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。使用JNDI方式配置数据源,前提必须在应用服务器上配置好数据源。
配置方式:在Tomcat的lib目录下或Servsers目录中、修改context.xml。并修改Tomcat的conf目录下context.xml文件
<Context>
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="30"
maxTotal="100" | maxActive="100"
maxWaitMillis="10000" | maxWait="10000"
name="myBBs"
username="root"
password="root"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/bbs_message?useUnicode=true&characterEncoding=utf-8"
/>
</Context>
<Resource>标签的name属性指定了数据源的名称,要与Spring配置文件中jndiName值java:comp/env/后的名称保持一致。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" >
<value>java:comp/env/myBBs</value>
</property>
</bean>
二、Spring中Bean的作用域
- 理解Bean的作用域
Spring中定义Bean,除了可以创建Bean实例并对Bean的属性进行注入外,还可以为所定义的Bean指定一个作用域。这个作用域的取值决定了Spring创建该组件实例的策略,进而影响程序的运行效率和数据安全。Spring2.0后的版本,Bean的作用域被划分为5种。
singleton 默认值。以单例模式创建Bean的实例,即容器中该Bean的实例只有一个
prototype 每次从容器中获取Bean时,都会创建一个新的实例
request 用于Web应用环境,针对每次HTTP请求都会创建一个实例
session 用于Web应用环境,同一个会话共享同一个实例,不同的会话使用不同实例
global session 仅在Portlet的Web应用中使用,同一个全局会话共享一个实例。对于非Portlet环境,等同于session
默认singleton,即Spring为每个Bean创建实例时仅创建一个。对于不能存在线程安全问题的组件,采用这种方式可以大大减少对象开销,提高运行效率。而存在线程安全问题的组件,则可以使用prototype作用域
<bean id="" class="" scope="prototype">
……
</bean>
- 使用注解指定Bean的作用域
- 可以使用@Scope注解实现,指定在一个组件Bean的类上面。@Scope("prototype")
三、Spring的自动装配
Spring的自动装配功能。在没有显示指定所依赖的Bean组件ID的情况下,自动装配,可以将于属性类型相符的(对于@Resource注解而言还会尝试id和属性名相符的)Bean自动注入给属性,从而简化配置。
<bean id="userMapper" class="cn.test.UserMapperImpl" autowire="byName" />
<!-- XML中自动装配 -->
<bean id="useService" class="cn.test.UserServiceImpl" autowire="byName" />
no 不使用自动装配。Bean依赖关系必须通过property元素定义
byType 根据属性类型自动装配。BeanFactory查找容器中全部Bean,有一个与依赖属性类型相同的Bean,就自动装配;如果有多个这样的Bean,Spring无法决定注入哪个Bean,会抛出一个致命异常;没有匹配的Bean,什么也不会发生,属性不会被设置。
byName 根据属性名自动装配。BeanFactory查找容器中全部Bean,找出id与属性的setter方法匹配的Bean。找到即自动注入,否则什么也不做
constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的Bean,那么会抛出异常
Spring配置文件中可以通过<beans>元素提供的default-autowire属性。监测哨维护单个Bean的注入方式。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
default-autowire="byName"></beans>
四、拆分Spring配置文件
- 拆分策略
- 对于使用XML方式进行配置的Spring项目,项目规模较大时,配置文件可读性、可维护性差,庞大的Spring配置文件难以阅读。团队开发时,多人修改同一配置文件容易发生冲突,降低开发效率。对于使用XML方式进行配置的Spring项目,可以将一个大的配置文件分解为多个小的配置文件,每个配置文件仅仅配置功能近似的Bean。
- 开发人员负责一个模块,采用公用配置(数据源、事务等)+每个系统模块一个单独配置文件(包含DAO、Service、Web)形式
- (数据源、事务等)+DAO Bean配置+业务逻辑Bean配置+Web控制器配置的形式。
- 拆分方法
- 根据ClassPathXmlApplicationContext类的构造方法的几种重载形式:
- public ClassPathXmlApplicationContext(String config);
- public ClassPathXmlApplicationContext(String... configs);
- 根据ClassPathXmlApplicationContext类的构造方法的几种重载形式:
- ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml");
- String configs={"applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml"}
- ApplicationContext ctx =new ClassPathXmlApplicationContext(configs);
- ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext*.xml");
- Spring配置文件中加载多个applicationContext.xml
- <impot resource="applicationContext-dao.xml/>
- <impot resource="applicationContext-service.xml/>