Spring-04 配置补充

一、灵活配置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&amp;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配置文件中jndiNamejava: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"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章