Spring配置补充

Spring配置补充:

实现Spring 和 MyBatis 集成过程中学习了,Spring 的配置数据源的方法; 实际开发过程中还有很多灵活的配置文件;

灵活配置DataSource:


	<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/cart" >property>
		<property name="username" value="root" >property>
		<property name="password" value="ok" >property>
	bean> 

方式一
使用属性文件配置数据源;
还记得MyBatis可以引用外部的 .properties文件来配置数据源吗?Spring对于这些操作当然是小ks了;
首先,引入外部的文件,你前提得有哦! 假设为:datasource.properties

driver=com.mysql.jdbc.Driver
password=ok
#url=jdbc:mysql://localhost/cart
#user=root   

		
 	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
		<property name="location" value="classpath:datasource.properties"/>  	
	bean>  
	
  	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${driver}" />     	
		<property name="url" value="jdbc:mysql://localhost:3306/cart" >property>
		<property name="username" value="root" >property>
		<property name="password" value="${password}" >property>
	bean>  
		

方式二
使用JNDI配置数据源; 了解JNDI 可以————— 点击.


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

服务器context.xml / 项目context.xml 中配置 数据源;

<Context>  
      <Resource name="jdbc/cart" auth="Container"   
      type="javax.sql.DataSource"  
      driverClassName="com.mysql.jdbc.Driver"  
      url="jdbc:mysql://localhost:3306/cart"  
      username="root"  						
      password="ok"  		
      maxActive="50"  
      maxIdle="30"  
      maxWait="10000" />  
Context>
 

方式三
C3P0实现数据源配置


	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver">property>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/cart">property>
		<property name="user" value="root">property>
		<property name="password" value="ok">property>
		
		
        <property name="minPoolSize" value="3">property>
        <property name="maxPoolSize" value="15">property>
        <property name="initialPoolSize" value="3">property>
		
	bean>

Spring中Bean的作用域:

Bean的作用域:

作用域 说明
singleton 默认值。Spring以单例模式创建Bean的实例,即容器中该Bean的实例只有一个
prototype 每次从容器中获取Bean时,都会创建一个新的实例, Spring不能对一个property bean的整个生命周期负责 因此客户端要负责property实例的生命周期管理
request 用于Web应用环境,针对每次HTTP请求都会创建一个实例
session 用于Web应用环境,同一个会话共享同一个实例,不同的会话使用不同的实例
global session 仅在Portlet的Web应用中使用,同一个全局会话共享一个实例。对于非Portlet环境,等同于session

实例:
Spring配置文件:applicationContext.xml

	
	<bean id="a类" class="类路径" >bean>
	
	<bean id="b类" class="类路径" scope="prototype"  >bean>  
	
public static void main(String[] args) {
     
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		A a1 = (A)context.getBean("a类"); //bean id;
		A a2 = (A)context.getBean("a类"); //bean id;
		System.out.println(a1==a2);  	  //结果为 true; 因为,Bean创建的默认级别以单例模式创建的,即该类对象在整个应用程序中,只有一个实例,多个对象指向是同一个空间地址;
		//单例模式的变量导致线程不安全;
		//一个程序只有一个 SqlSession 对象,当A线程执行新增 B修改,B完成了操作关闭了SqlSession 因为整个应用程序公用一个,导致A的也关闭了. A操作失败! 
	//解决:
		//可以通过改变, Spring中Bean的作用域: 
		//B 类,Spring管理时设置了 scope 作用域;
		B b1 = (B)context.getBean("b类"); //bean id;
		B b2 = (B)context.getBean("b类"); //bean id;
		System.out.println(b1==b2);  	  //结果为 false; 
}

A B 类就随便创就好了!☺

使用注解指定Bean的作用域:
对于使用注解声明Bean 组件,如需修改其作用域,可以使用@Scope注解实现,关键字:

@Scope("prototype")		//指定作用域;		
@Component 				//声明Bean;
public class A {
     
}

Spring的自动装配:

之前章节介绍通过, @Autowired@Resource 注解实现依赖注解, 依靠着 Spring容器的自动装配功能;
通过自动装配技术, 可以将与属性类型相符的 (对于@Resource注解而言 还会尝试, ID 和属性名相符合) Bean自动注入给属性; 简化操作;
autowire属性值及说明:

说明
no 默认值。Spring 默认不进行自动装配,必须显式指定依赖对象
byName 根据属性名自动装配。Spring 自动查找与属性名相同的id,如果找到,则自动注入,否则什么都不做
byType 根据属性的类型自动装配。Spring 自动查找与属性类型相同的Bean,如果刚好找到唯一的那个,则自动注入;如果找到多个与属性类型相同的Bean,则抛出异常;如果没找到,就什么也不做
constructor 和byType 类似,不过它针对构造方法。如果 Spring 找到一个Bean和构造方法的参数类型相匹配,则通过构造注入该依赖对象;如果找不到,将抛出异常

实例:
Spring配置文件:applicationContext.xml

	
	<bean id="a类" class="类路径"  autowire="byName"  > 		
		 <property name="属性名: B"  ref="B" >property>   
		....
	bean>  
	

在Spring 配置文件中, 通过< bean > 元素, autowire 属性实现自动装配;
< beans> 根目录:还提供了 default-autowire 属性, 设置该属性 影响全局, 减少单个 Bean的注入方式;


<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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"
		
		default-autowire="default"  
		> 
		
		
		
	beans>

拆分Spring配置文件:

项目规模变大,配置文件可读性、可维护性差
团队开发时,多人修改同一配置文件,易发生冲突
更符合 “分而治之“ 的软件工程原理~
两种方式
方式一:
当一个项目中有多个 Spring 配置文件:applicationContext1.xml applicationContext2.xml …
读取时:通过:
ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext1.xml”,“applicationContext2.xml”);
方法的 重载来实现一次读取多个 配置文件;
或通过 (*) 通配符来指定多个;
ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext *.xml”); // 文件的前缀. *来指定一定规范的命名文件;
除此之外还支持, String[] 形式传参数...
方式二:
设置一个配置文件为 : 配置文件的集成文件;
假设:
存在 A B 两个Spring 配置文件, 可以在 A 在引入B 文件/或更多…;
读取时候读取 A 就同时读取了 B …文件;
A文件使用:来引入其它文件;
< import resource=“B文件引用” />


ok。 又搞完一章, 智勇你看完了吗?

你可能感兴趣的:(SSM,spring,java,mybatis)