Spring配置补充

  • 一、灵活配置DataSource

  实现Spring和MyBatis整合

  •   使用属性文件配置数据源 

        在使用Spring整合MyBatis时,在XML配置中可以将数据库连接信息。为了使DataSource的可配置性更强,便于维护。Spring也支持从属性文件中获取信息来进行数据源配置。使用Spring提供的PropertyPlaceholderConfigurer类可以假装属性文件。在Spring配置文件中可以采用${...}的方式引用属性文件中的键值对。读取属性文件配置DataSource

  mybatis-spring.版本号.jar、spring-beans.版本号.jar等相关JAR包

 <!--引入properties文件-->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<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>
注意:${}中对应属性文件的键值,如果不小心输入括号可能导致报错
  •   使用JNDI数据源

  如果应用部署在高性能的应用服务器(如Tomcat、WebLogic等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI方式供使用者调用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。使用JNDI方式配置数据源,前提必须在应用服务器上配置好数据源。

  配置方式:在Tomcat的lib目录下或Servsers目录中、修改context.xml。并修改Tomcat的conf目录下context.xml文件

  

<Context>

  <Resource

    auth="Container"

    driverClassName="com.mysql.jdbc.Driver"

    maxIdle="30"

    maxTotal="100" | maxActive="100"

    maxWaitMillis="10000" | maxWait="10000"

    name="myBBs"

    username="root"

    password="root"

    type="javax.sql.DataSource"

    url="jdbc:mysql://localhost:3306/bbs_message?useUnicode=true&amp;characterEncoding=utf-8"

    />

  </Context>

  <Resource>标签的name属性指定了数据源的名称,要与Spring配置文件中jndiName值java:comp/env/后的名称保持一致。

  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" >
      <value>java:comp/env/myBBs</value>
    </property>
  </bean>

二、Spring中Bean的作用域

  •   理解Bean的作用域

   Spring中定义Bean,除了可以创建Bean实例并对Bean的属性进行注入外,还可以为所定义的Bean指定一个作用域。这个作用域的取值决定了Spring创建该组件实例的策略,进而影响程序的运行效率和数据安全。Spring2.0后的版本,Bean的作用域被划分为5种。

  singleton     默认值。以单例模式创建Bean的实例,即容器中该Bean的实例只有一个

  prototype     每次从容器中获取Bean时,都会创建一个新的实例

  request      用于Web应用环境,针对每次HTTP请求都会创建一个实例

  session      用于Web应用环境,同一个会话共享同一个实例,不同的会话使用不同实例

  global session   仅在Portlet的Web应用中使用,同一个全局会话共享一个实例。对于非Portlet环境,等同于session

  默认singleton,即Spring为每个Bean创建实例时仅创建一个。对于不能存在线程安全问题的组件,采用这种方式可以大大减少对象开销,提高运行效率。而存在线程安全问题的组件,则可以使用prototype作用域

<bean id="" class="" scope="prototype">
 ……
</bean>
  •   使用注解指定Bean的作用域
    •  可以使用@Scope注解实现,指定在一个组件Bean的类上面。@Scope("prototype")

三、Spring的自动装配

  Spring的自动装配功能。在没有显示指定所依赖的Bean组件ID的情况下,自动装配,可以将于属性类型相符的(对于@Resource注解而言还会尝试id和属性名相符的)Bean自动注入给属性,从而简化配置。

<bean id="userMapper" class="cn.test.UserMapperImpl" autowire="byName" />
<!-- XML中自动装配 -->
<bean id="useService" class="cn.test.UserServiceImpl" autowire="byName" />

  no     不使用自动装配。Bean依赖关系必须通过property元素定义

  byType   根据属性类型自动装配。BeanFactory查找容器中全部Bean,有一个与依赖属性类型相同的Bean,就自动装配;如果有多个这样的Bean,Spring无法决定注入哪个Bean,会抛出一个致命异常;没有匹配的Bean,什么也不会发生,属性不会被设置。

  byName   根据属性名自动装配。BeanFactory查找容器中全部Bean,找出id与属性的setter方法匹配的Bean。找到即自动注入,否则什么也不做

  constructor  与byType的方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的Bean,那么会抛出异常 

Spring配置文件中可以通过<beans>元素提供的default-autowire属性。监测哨维护单个Bean的注入方式。

  

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
default-autowire="byName"></beans>



 

四、拆分Spring配置文件

  •   拆分策略
    •   对于使用XML方式进行配置的Spring项目,项目规模较大时,配置文件可读性、可维护性差,庞大的Spring配置文件难以阅读。团队开发时,多人修改同一配置文件容易发生冲突,降低开发效率。对于使用XML方式进行配置的Spring项目,可以将一个大的配置文件分解为多个小的配置文件,每个配置文件仅仅配置功能近似的Bean。
    • 开发人员负责一个模块,采用公用配置(数据源、事务等)+每个系统模块一个单独配置文件(包含DAO、Service、Web)形式
    • (数据源、事务等)+DAO Bean配置+业务逻辑Bean配置+Web控制器配置的形式。
  •   拆分方法
    • 根据ClassPathXmlApplicationContext类的构造方法的几种重载形式:
      •   public ClassPathXmlApplicationContext(String config);
      •   public ClassPathXmlApplicationContext(String... configs);
  • 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配置文件中加载多个applicationContext.xml
    •   <impot resource="applicationContext-dao.xml/>
    •     <impot resource="applicationContext-service.xml/>
posted @ 2019-06-26 10:12  Slike劫  阅读(235)  评论(0编辑  收藏  举报