2022/5/2 Spring框架配置扩展

目录

1.配置数据源

        1.1 使用properties文件配置数据源

        1.2 使用JNDI(javaNameAndDirectoryInterface)配置数据源

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

        2.1 第一种方式

        2.2 第二种方式

3.Bean的自动装配

        3.1 在xml配置文件中使用bean标签的autowire属性

        3.2 配置整个配置文件中的beans根节点统一配置

4.Bean的作用域(重点)

        4.1 Singleton

        4.2 Prototype

        4.3 Request

        4.4 Session

        4.5 Application

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.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;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的单例作用域相似,但是也有如下不同之处:

  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等多种作用域,可以通过配置指定。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abcdzzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值