一、灵活配置DataSource
1、使用属性文件配置数据源
database.properties文件如下
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms
username=root
password=1998
- 步骤一:引入properties文件
<!-- 引入properties文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!--引入单个属性文件-->
<property name="location">
<value>classpath:database.properties</value>
</property>
<!--引入多个文件-->
<property name="locations">
<list>
<value>classpath:属性文件1</value>
<value>classpath:属性文件2</value>
<!--使用通配符(*)一次性引入多个文件-->
<value>classpath:*.properties</value>
</list>
</property>
</bean>
- 步骤2:配置DataSource
<!--配置DataSource -->
<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>
2、使用JNDI数据源
- 步骤一:在Tomcat中的lib文件夹下加入数据库驱动包
- 步骤二:在tomcat下的context.xml中配置JDNI数据源,编写连接数据库配置
<Context>
<Resource name="jdbc/smbms" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="root"
password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8"/>
</Context>
- 步骤三:在Spring配置文件中通过JNDI配置DataSource
<!-- 通过jndi配置DataSource -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<!-- 通过jndiName指定引用的jndi数据源名称-->
<property name="jndiName">
<value>java:comp/env/jdbc/smbms</value>
</property>
</bean>
注: Context.xml中的<Resource>
元素的name 表示为JNDI数据源名称,name的属性值需要与Spring配置文件中jndiName值java:comp/env/
后的名称保持一致。
二、Spring中Bean的作用域
1、理解Bean的五种作用域
- singleton
默认值。以单例模式创建Bean的实例,即容器中该Bean的实例只有一个。(等同于static) - prototype
每次从容器中获取Bean时,都会创建一个新的实例。(new一次) - request
用于Web应用环境,针对每次HTTP请求都会创建一个实例。 - session
用于Web应用环境,同一个会话共享一个实例,不同的会话使用不同的实例。 - global session
仅在Portlet的Web应用中使用,同一个全局会话共享一个实例;对于非Portlet环境,等同于session。
注:
(1)singleton是默认采用的作用域,即默认情况下Spring为每个Bean仅创建一个实例,对于不存在线程安全问题的组件,采用这种方式可以大大减少创建对象的开销,提高运行效率。
(2)而对于存在线程安全问题的组件,则不能使用singleton模式,可以使用prototype作用域,通过scope属性,代码如下
<bean id="xxx" class="xxx" scope="prototype"/>
2、使用注解指定Bean的作用域
@Scope("prototype") //注解设置该Bean的作用域为prototype
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userMapper")
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
三、Spring的自动装配
1、采用传统的xml方式配置Bean组件
<!-- 配置UserMapper -->
<bean id="userMapper" class="cn.smbms.dao.user.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- 配置业务Bean并注入DAO实例 -->
<bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>
2、使用自动装配
<!--使用自动装配-->
<!--配置DAO 根据属性名称自动装配 -->
<bean id="userMapper" class="cn.smbms.dao.user.UserMapperImpl" autowire="byName"/>
<!-- 配置业务bean,根据属性名称自动装配 -->
<bean id="userService" class="cn.smbms.service.user.UserServiceImpl"autowire="byName"/>
3、autowire属性值及其说明
-
no:不适用自动装配。Bean依赖关系必须通过property元素定义。
-
byType:根据属性类型自动装配。BeanFactory查找容器中全部的Bean,如果正好有一个与依赖属性类型相同的Bean,就自动装配这个属性;如果有多个,Spring无法决定注入哪个Bean,则会抛出致命异常;如果没有匹配的Bean,则属性不会被设置。
-
byName:根据属性名自动装配。BeanFactory查找容器中的全部Bean,找出id与属性的setter方法匹配的Bean,找到即自动注入,否则什么都不做
-
constructor:与byType的方式类似,不同之处就在于它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的Bean,那么将会抛出异常。
4、全局自动装配
<beans>
元素提供了default-autowire属性,设置全局自动装配。
例:
<beans default-autowire="byName"/>
<!--省略部分代码-->
</beans>
注: 对于大型的应用,不鼓励使用自动装配,虽然使用自动装配可减少配置工作量,但大大降低了依赖关系的清晰性与透明性,依赖关系的装配仅依赖于源文件的属性名或类型,导致Bean与Bean之间的耦合降低到代码层次,不利于高层次解耦合。
四、拆分Spring配置文件
1、拆分策略
- 横向拆分(适用于大项目,模块、需求较多):如果一个开发人员负责一个模块,我们采用公用配置(包含数据源、事务等)+每个系统模块一个单独配置文件(包含Dao、Service及Web控制器)的形式。
- 纵向拆分:如果开发是按照分层进行的分工,我们采用公用配置(包含数据源、事务等)+Dao Bean配置+业务逻辑Bean + Web控制器配置的形式。
2、拆分方法
加载拆分后的Spring配置文件,使用ClassPathXmlApplicationContext
类的重载构造方法。
public ClassPathXmlApplicationContext(String configLocation);
public ClassPathXmlApplicationContext(String configLocations);
- 方式一:
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配置文件本身也可以通过import子元素导入其他配置文件,将多个配置文件整合到一起,形成一个完整的Spring配置文件。
例:
<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>