Spring框架配置扩展

目录

1.配置数据源

    [1.1 使用properties文件配置数据源](#t1)

    [1.2 使用JNDI(javaNameAndDirectoryInterface)配置数据源](#t2)

2.拆分Spring配置文件(2种方式)

    [2.1 第一种方式](#t4)

    [2.2 第二种方式](#t5)

3.Bean的自动装配

    [3.1 在xml配置文件中使用bean标签的autowire属性](#t7)

    [3.2 配置整个配置文件中的beans根节点统一配置](#t8)

4.Bean的作用域(重点)

    [4.1 Singleton](#t10)

    [4.2 Prototype](#t11)

    [4.3 Request](#t12)

    [4.4 Session](#t13)

    [4.5 Application](#t14)

5.本章总结

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.Driverurl=jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;characterEncoding=UTF-8password=rootuname=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">

测试:

@Testpublic 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的单例作用域相似,但是也有如下不同之处:

  1. application作用域是每个ServletContext中包含一个,而不是每个SpringApplicationContext之中包含一个(某些应用中可能包含不止一个ApplicationContext)。
  2. application作用域仅仅作为ServletContext的属性可见,单例Bean是ApplicationContext可见。

5.本章总结

  1. 数据库配置信息可以放在****properties文件中单独维护。
  2. Spring框架可以使用PropertySourcesPlaceholderConfigurer加载properties文件,实现更灵活地数据源配置。
  3. Spring框架可以从服务器环境中获取JNDI资源。
  4. Spring框架提供了自动装配(autowire)功能,常用方式包括byName和byType。
  5. Spring框架支持同时使用多个配置文件,可以通过ClassPathXmlApplicationContext类的构造方法加载多个配置文件,也可以在配置文件中通过import标签引入其他配置文件。
  6. Spring框架中Bean拥有singleton丶prototype丶request丶session丶global session丶application等多种作用域,可以通过配置指定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值