Spring的扩展的知识点
- Bean的作用域
- Spring的自动装配
- 拆分Spring的配置文件
Bean的作用域
当通过spring容器创建一个Bean的实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。
Spring支持如下5中作用域
- Singleton:单例作用域,是Spring容器默认的作用域。在整个Spring Ioc容器中,使用Singleton定义的Bean将只有一个实例。单例模式一般适用于那些无会话状态的Bean (比如辅助工具类、Dao组件、业务逻辑组件等等)
- prototype:原型模式,每次通过容器的getBean()方法获取prototype定义的Bean时,都会创建一个新的实例。
- request:对于每次HTTP请求,使用request定义的Bean都会产生一个新的实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
- session:对于每次HTTP Session,使用session定义的Bean都将产生一个新的实例,同一个会话共享同一个实例,不同的会话使用不同的实例,同样只有在Web应用中使用Spring时,该作用于才会生效。
- globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
reqest、session、globalsession仅在基于web的spring ApplicationContext情形下才有效
Spring的自动装配
什么是自动装配
设置注入和构造注入有时在做配置时比较麻烦,为了提高开发效率,提供了自动转装配功能,简化配置。
Spring框架是默认不支持自动装配的,想要使用自动装配需要修改spring配置文件中标签的autowire属性
设置注入
<!-- 配置Service层 设置注入 -->
<bean id="userService" class="cn.smbms.service.UserServiceImpl">
<property name="userMapper" ref="userMapper" />
</bean>
自动装配
<!-- 配置业务Bean 根据属性名称自动装配 -->
<bean id="userService" class="cn.smbms.service.UserServiceImpl"
autowire="byName"/>
Spring提供的自动装配的类型
- no
默认值。Spring默认不进行自动装配,必须显示依赖对象。 - byname
根据属性名自动装配。Spring自动查找与属性名相同的id,如果找到,则自动注入,否则什么都不做。 - byType
根据属性的类型自动装配。Spring自动查找与属性类型相同的Bean,如果刚好找到唯一的哪个,则自动注入;如果找到多个与属性类型相同的Bean,则抛出异常;如果没找到就什么也不做。 - consturctor
和byname类似,不过它针对构造方法。如果Spring找到一个Bean和构造方法的参数类型相匹配,则通过构造注入该依赖对象;如果找不到,将抛出异常。
注意:
每个Bean都需要设置autowire属性,较繁琐。可以为 beans 元素设置default-autowire属性,影响全局
拆分Spring的配置文件
为什么要拆分配置文件
项目规模变大。配置文件可读性、可维护性差
团队开发时,多人修改同一配置文件,易发生冲突
拆分策略
公用配置+每个系统模块一个单独配置文件(包含DAO、Service、Web控制器)
公用配置+DAO Bean配置+业务逻辑Bean配置+Web控制器配置
两种策略各有特色,适用于不同的场合
引用拆分后的配置文件的两种放方法
- 利用ClassPathXmlAoolicationContext的重载方法可以配置多个配置文件,用逗号隔开或者使用通配符。
//方法一
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml",
"ApplicationContext-dao.xml",
"ApplicationContext-service.xml");
- 使用<import resource="xxx.xml>方式
//方法二
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
配置数据源的方式
一、 数据库连接信息直接写入数据源
ApplicationContext.xml
//配置数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
二、 数据库连接信息写入属性文件中
属性文件database.propetiesr
//属性文件database.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
username=root
password=root
ApplicationContext.xml
<!-- 引入propertirs文件 PropertyPlaceholderConfigurer可以引用属性文件,在Spring配置文件中采用诸如${url}的方式引用属性值 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<!-- dbcp方式配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
三、JNDI配置数据源
配置apache-tomcat-7.0.57/conf/context.xml
<!-- maxActive最大的活动数 maxIdle最大闲置数-->
<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://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8"/>
ApplicationContext.xml
<!-- JNDI方式配置数据源 -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/smbms</value>
</property>
</bean>