目录
1.2 使用JNDI(javaNameAndDirectoryInterface)配置数据源
3.1 在xml配置文件中使用bean标签的autowire属性
1.配置数据源
1.1 使用properties文件配置数据源
使用properties文件引入,定制数据源时,引入配置文件中的属性
<!-- 引入properties文件-->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:db.properties"/>
</bean>
<!-- 数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${uname}"/>
<property name="password" value="${password}"/>
</bean>
properties文件中
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=UTF-8
password=root
uname=123123
1.2 使用JNDI(javaNameAndDirectoryInterface)配置数据源
在Tomcat中conf目录下的context.xml文件中,配置如下
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<!--
|- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称,
为了不与其他的名称混淆,所以使用jdbc/oracle,现在配置的是一个jdbc的关于oracle的命名服务。
|- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
|- type:此名称所代表的类型,现在为javax.sql.DataSource
|- maxActive:表示一个数据库在此服务器上所能打开的最大连接数
|- maxIdle:表示一个数据库在此服务器上维持的最小连接数
|- maxWait:最大等待时间。10000毫秒
|- username:数据库连接的用户名
|- password:数据库连接的密码
|- driverClassName:数据库连接的驱动程序
|- url:数据库连接的地址
-->
<!--配置MySQL数据库的JNDI数据源-->
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&characterEncoding=utf-8"/>
</GlobalNamingResources>
在Spring核心配置文件中编写如下代码:
<!-- 通过JNDI配置DataSource-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<!-- name的值时固定的,value的值java:comp/env/此部分是固定的,后面的部分是JNDI数据源中的name -->
<property name="jndiName" value="java:comp/env/jdbc/mysql"/>
</bean>
</beans>
2.拆分Spring配置文件(2种方式)
如果选择使用XML配置文件的方式开发Spring项目,则当项目规模越来越大时,项目中的Bean也越来越多,配置文件将变得越来越臃肿,可读性和维护性都会降低;多人修改同一配置文件时也容易发生冲突,影响开发效率。因此,Spring框架提供了可以将配置文件拆分处理的功能,可以将一个大的配置文件分解成多个小配置文件。
2.1 第一种方式
把Spring配置文件按照一定规则拆分成若干个文件,通过ClassPathXmlApplicationContext类提供的重载进行合成加载。
如果有多个配置文件需要载入,可以用多字符串参数或String[]数组形式传入多个配置文件名,也可通过通配符的形式进行传参;
//1--使用通配符的方法
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext*.xml");
//2--用多字符串参数
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml");
//3--使用String[]数组形式
String [] configs={"applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml"};
ApplicationContext context=new ClassPathXmlApplicationContext(configs);
2.2 第二种方式
通过import标签,在Spring核心配置文件中载入其他部分的配置文件,加载时,只需指定核心配置文件即可。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>
<!--这个import,一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
使用的时候,直接使用总的配置就可以了
-->
</beans>
3.Bean的自动装配
3.1 在xml配置文件中使用bean标签的autowire属性
其属性值:
值 | 说明 |
---|---|
no | 不使用自动装配。必须通过property元素定义 |
byName | 根据属性明自动装配。BeanFactory查找容器中的全部Bean,找到id与属性的setter方法匹配的Bean,找到则自动注入,否则什么都不做。 |
byType | 根据属性类型自动装配,BeanFactory查找容器中的全部Bean,如果正好有一个依赖属性类型相同的Bean,则自动装配这个属性;如果有多个这样的bean,则会抛出异常;如果没有匹配的Bean,则什么都不会发生,属性不会被设置。 |
constructor | 应用于构造器参数,与byType相似,如果容器中没有与之构造器参数类型一致的bean,则会抛出异常。 |
3.2 配置整个配置文件中的beans根节点统一配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd" default-autowire="byName">
</beans>
4.Bean的作用域(重点)
在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。
目前Spring Bean的作用域或者说范围主要有五种。
作用域 | 描述 |
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。 |
application | 限定一个Bean的作用域为ServletContext 的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。 |
几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。
4.1 Singleton
当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成
singleton,可以这样配置:
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
测试:
@Test
public void test03(){
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
System.out.println(user==user2);
}
4.2 Prototype
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
在XML中将bean定义成prototype,可以这样配置:
<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>
或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
4.3 Request
当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP
请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring
ApplicationContext情形下有效。考虑下面bean定义:
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
4.4 Session
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域
仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
4.5 Application
全局作用域参考如下的Bean定义
<bean id="appPreferences" class="com.foo.AppPreferences" scope="application"/>
Spring容器会在整个web应用范围使用到appPreferences的时候创建一个新的AppPreferences的实例。也就是说,appPreferencesBean是在ServletContext级别的,作为常规的ServletContext属性。这种作用域在一些程度上来说和Spring的单例作用域相似,但是也有如下不同之处:
- application作用域是每个ServletContext中包含一个,而不是每个SpringApplicationContext之中包含一个(某些应用中可能包含不止一个ApplicationContext)。
- application作用域仅仅作为ServletContext的属性可见,单例Bean是ApplicationContext可见。
5.本章总结
- 数据库配置信息可以放在properties文件中单独维护。
- Spring框架可以使用PropertySourcesPlaceholderConfigurer加载properties文件,实现更灵活地数据源配置。
- Spring框架可以从服务器环境中获取JNDI资源。
- Spring框架提供了自动装配(autowire)功能,常用方式包括byName和byType。
- Spring框架支持同时使用多个配置文件,可以通过ClassPathXmlApplicationContext类的构造方法加载多个配置文件,也可以在配置文件中通过import标签引入其他配置文件。
- Spring框架中Bean拥有singleton丶prototype丶request丶session丶global session丶application等多种作用域,可以通过配置指定。