欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

7.spring相关配置

程序员文章站 2022-07-14 20:11:19
...

一.application

<?xml version="1.0" encoding="UTF-8"?>
<!-- #############################【功能引入】############################################## -->
<!--
  beans 整个配置文件的根节点, 包含一个或多个bean元素
  ##最基本的命名空间定义
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  ##拓展的命名空间
  //启动自动扫描或注释装配时命名空间
  xmlns:context="http://www.springframework.org/schema/context"
  //启用AOP功能时命名空间
  xmlns:aop="http://www.springframework.org/schema/aop"
  //启动声明事务时命名空间
  xmlns:tx="http://www.springframework.org/schema/tx"
  //启动配置bean实例命名空间
  xmlns:bean="http://www.springframework.org/schema/beans"
  ##与上述命名空间定义配套的schema约束文件转载路径
  xsi:schemaLocation="
  		http://www.springframework.org/schema/beans
  		http://www.springframework.org/schema/beans/spring-beans-版本号.xsd   //beans
  		http://www.springframework.org/schema/context   //context
  		http://www.springframework.org/schema/context/spring-context-版本号.xsd
  		http://www.springframework.org/schema/aop   //aop
  		http://www.springframework.org/schema/aop/spring-aop-版本号.xsd
  		http://www.springframework.org/schema/tx   //aop
  		http://www.springframework.org/schema/tx/spring-aop-版本号.xsd
  "
 -->
<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"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:bean="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
  		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  		http://www.springframework.org/schema/context
  		http://www.springframework.org/schema/context/spring-context-4.2.xsd
  		http://www.springframework.org/schema/aop
  		http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
  		http://www.springframework.org/schema/tx
  		http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">


  		<!-- #############################【功能启动配置】############################################## -->
  		<!-- 引入xx.properties配置文件
  			属性:location:配置文件路径, 建议加上classpath: 前缀
  			属性:system-properties-mode 写上NEVER, 不使用环境变量中的配置参数
  		 -->
  		<context:property-placeholder location="" system-properties-mode="NEVER"/>
  		<!-- 开启注解处理器 -->
  		<context:annotation-config/>
  		<!--
  			开启组件自动扫描:配置有 @Service @Controller @Component @Repository都为扫描对象
  		 	属性:base-package: 扫描包路径,多个包使用[,]分隔开
  		 -->
  		<context:component-scan base-package=""/>
  		<!-- 开启居于@AspectJ切面的注解处理器 -->
  		<aop:aspectj-autoproxy/>

  		<!-- #############################【Bean实例创建配置】############################################## -->
  		<!--
  			使用class属性指定类的默认构造器创建单实例bean, 名称由id属性指定:
  			注意:建议显示写出公共的无参数构造器
  		 -->
  		<bean id="Bean实例名称" class="Bean类的全限定类名"/>
  		<!--
  			属性:scope 设置bean有效作用范围
  			取值:singleton : 单例模式,全局中唯一一份Bean实例
  				prototype : 原型模式,每次获取创建新的Bean实例
  				request   : 请求模式,一次http请求,创建 一次bean,仅在当前请求中有效
  				session	      : 会话模式,一次http请求,创建一次bean, 仅在当前请求中的session有效
  				global session:全局会话模式, 仅仅在基于portlet的web应用中才有意义,
  					bean被限定于全局portlet Session的生命周期范围内, 在web中等价于session
  		-->
  		<bean id="Bean实例名称" class="Bean类的全限定类名" scope="prototype"/>
		<!--
			init-method : 对象实例化后,调用该方法执行初始化操作
			destroy-method : 对象销毁时调用该方法执行收尾操作
		  -->
		<bean id="Bean实例名称" class="Bean类的全限定类名"
		init-method="初始化时调用方法名"
		destroy-method="对象销毁时调用的方法名"/>
		<!--
			属性:lazy-init:延时初始化, 通过改变器值设置初始化时间
			    默认情况下,容器BeanFactory在使用到bean时才创建bean
			    默认情况下,容器ApplicationContext在启动时创建bean
		 -->
		<bean id="Bean实例名称" class="Bean类的全限定类名" lazy-init="default"/>

		<!-- #############################【Bean实例属性赋值】############################################## -->
		<!-- property 标签用于对Bean实例中的属性进行赋值,对于基本数据类型的值可直接指定,而ref表示对其他bean实例的引用 -->
		<bean id="Bean实例名称" class="Bean类的全限定类名">
			<property name="Bean类中属性名称" ref="要引用的Bean名称"/>
			<property name="Bean类中属性名称" value="直接指定属性值"/>
			<property name="Bean类中属性名称">
				<!-- 创建一个内容匿名Bean实例赋值给指定的属性, 该匿名Bean实例无法被外界访问 -->
				<bean class="Bean类全名"/>
			</property>
			<!--
				set标签用于创建一个Set类型的实例赋值给指定的set类型属性, Set实例中的元素通过value
				或者ref子标签指定, 对于基本数据类型的元素可有value标签生成, 如果需要引用其他Bean实例
				做Set元素的话,可由ref标签指定
			-->
			<property name="Bean类中Set类型属性名称">
				<set>
					<value>set中元素(基本数据)</value>
					<ref bean="要引用的bean的名称"/>
				</set>
			</property>
			<!-- list标签用于创建List类型的实例赋值给指定的list类型属性 -->
			<property name="Bean类中List类型属性名称">
				<list>
					<value>list中的元素</value>
					<ref bean="要引用的bean的名称"/>
				</list>
			</property>

			<!--
				map标签用于创建Map类型实例赋值给指定的Map类型属性, map实例中的元素通过
				entry子标签指定, Map元素的键由entry标签的key属性直接指定, 值可以由
				value 或者ref标签指定
			 -->
			<property name="Bean类中Map类型属性名称">
				<map>
					<entry key="map元素的key">
						<value>map元素的value</value>
					</entry>

					<entry key="map元素的key">
						<ref bean="要引用的Bean名称"/>
					</entry>
				</map>
			</property>


			<!-- 创建一个Properties类型的实例赋值给指定Properties类型属性 -->
			<property name="Bean类Properties类型属性名称">

				<props>
					<!--
						Properties 实例中的属性想元素由prop标签生成,属性项元素的键由key属性指定
						属性想的元素的值可放置在prop标签体中
					 -->
					<prop key="properties元素的key">properties元素的value</prop>
				</props>
			</property>

			<property name="Bean类中要初始化为null属性名称">
				<!-- null标签用于给赋值null值的属性进行赋null值 -->
				<null/>
			</property>
		</bean>

		<!-- #############################【Bean构造器赋值】############################################## -->
		<bean id="Bean实例名称" class="Bean类的全限定类名">
			<!--
				通过传入的相应的构造参数进行Bean实例化, constructor-arg标签用于指定一个构造器参数
				其index属性表名当前第几个构造参数(从0开始),type属性声明构造器参数的类型,构造参数的值如果是
				基本类型可由value属性直接指定,如果是引用类型,则又ref属性指定
			 -->
			<constructor-arg index="从0开始的***"  type="构造参数的类型" value="构造参数的值"/>
			<constructor-arg index="从0开始的***"  type="构造参数的类型" ref="要引用的bean名称"/>
		</bean>

		<!-- #############################【AOP配置】############################################## -->
		<bean id="目标对象名称" class="目标对象类全名"/>
		<bean id="切面实例名称" class="切面类全名"/>
		<aop:config>
			<aop:aspect id="切面ID" ref="要引用的切面实例名称">
				<aop:pointcut id="切入点名称" expression="切入点正则表达式" />
				<aop:before pointcut-ref="切入点名称"  method="切面类中用作前置通知的方法名"/>
				<aop:after-returning pointcut-ref="切入点名称"  method="切面类中用作后置通知的方法名"/>
				<aop:after-throwing pointcut-ref="切入点名称"  method="切面类中用作异常置通知的方法名"/>
				<aop:after pointcut-ref="切入点名称"  method="切面类中用作最终置通知的方法名"/>
				<aop:around pointcut-ref="切入点名称"  method="切面类中用作环绕置通知的方法名"/>
			</aop:aspect>
		</aop:config>

		<!-- #############################【事务配置】############################################## -->
		<!-- 配置事务管理器 -->
		<bean id="事务管理器实例名称" class="事务管理器类全名">
			<property name="数据源属性名" ref="要引用的数据源实例名称"/>
		</bean>

		<!-- 配置一个事务通知  -->
		<tx:advice id="事务通知名称" transaction-manager="事务管理器实例名称">
			<tx:attributes>
				<!-- 方法以get/select/query开头,不使用事务 -->
				<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
				<tx:method name="select*" read-only="true" propagation="NOT_SUPPORTED"/>
				<tx:method name="query*" read-only="true" propagation="NOT_SUPPORTED"/>
				<!-- 其他方法以默认事务进行 -->
				<tx:method name="*"/>
			</tx:attributes>
		</tx:advice>
		<!-- 使用AOP技术实现事务管理 -->
		<aop:config>
			<aop:pointcut id="事务切入点名称" expression="事务切入点正则表达式" />
			<aop:advisor advice-ref="事务通知名称" pointcut-ref="事务切入点名称"/>
		</aop:config>
</beans>

二.MyBatis

一. mybatis执行流程:

  1. 配置总配置文件(mybatis-config.xml):
    1. 导入db.properties
    2. 配置事务管理
    3. 配置数据源
    4. 引入Mapper文件
  2. 配置映射文件(xxxMpper.xml)
    1. 制定映射规则
    2. crud操作
      涉及到动态sql: where sql trim if
  3. 启动框架与执行
    1. 加载总配置文件
    2. 创建SqlSessionFactory
    3. 创建SqlSession对象
    4. 执行curd操作
    5. 提交事务
    6. 关闭资源

二. 关系映射

  1. 一对一
例子:QQ号(QQNumber)与(QQZone)
   class QQNumber(){
	QQZone zone = ....
   }
   class QQZone(){}
  1. 多对一

    1. 例子:员工(多:Employee)与 部门(一:Department)
    class Employee{
         Department dept = ...
      }
      class Department{
        
      }
    
    1. 映射:
      额外SQL方式:
    <resultMap type="Employee" id="BaseResultMap1">
    	<association 
    	   property="dept" 
    	   javaType="Department" 
    	   column="dept_id" 
    	   select="xxx.xxx.DepartmentMapper.get">
    	 </association>
      </resultMap>
    
      sql: select * from Employee
    

    内联方式:

    <resultMap type="Employee" id="BaseResultMap">
    	<association property="dept" javaType="Department">
    	   <id column="d_id" property="id"/>
    	   <result column="d_name" property="name"/>
    	</association>
      </resultMap>
    
      sql: select e.*, d.id d_id, d.name d_name from Employee e  join
            Department d on e.dept_id = d.id
    
  2. 一对多

    1. 例子:部门(一:Department)与员工(多:Employee)
    class Department{
         List<Employee> es = .....
      }
      class Employee{
        
      }
    
    1. 映射:
      额外sql:
    <resultMap type="Department" id="BaseResultMap">
    	<collection 
    		property="es"  
    		ofType="Employee" 
    		column="id"
    		select="xxx.xx.EmployeeMapper.getEmplByDeptId"
    	 />
      </resultMap>
      sql: select * from Department
    

    内联方式:

    <resultMap type="Department" id="BaseResultMap2">
    	<collection 
    	        property="es"  
    		ofType="Employee" column="id">
    		    <id column="e_id" property="id"/>
    		    <result column="e_name" property="name"/>
    	</collection>
      </resultMap>
      sql: select d.*, e.id as e_id, e.name as e_name from t_department d 
           JOIN t_employee e on d.id = e.dept_id where d.id = #{id};
    
  3. 多对多

    1. 例子:学生(多:Student)与老师(多:Teacher)
    class Student {
    	private List<Teacher> ts = new ArrayList<>();
      }
      public class Teacher {
      }
    
    1. 映射:
      额外sql方式:
    <resultMap type="Student" id="BaseResultMap">
    	<collection 
    	   property="ts" 
    	   ofType="Teacher" 
    	   column="id" 
    	   select="xx.xx.TeacherMapper.getTeacherByStuId"/>
      </resultMap>
       getTeacherByStuId : 通过 student_teacher表查
      
      sql: select * from Student
    

    内联方式:

    <resultMap type="Student" id="BaseResultMap2">
    	<collection 
    		property="ts" 
    		ofType="Teacher">
    		<id column="t_id"  property="id"/>
    		<result column="t_name" property="name"/>
    	</collection>
     </resultMap>
      sql: select s.*, t.id t_id, t.name t_name from student s
           join student_teacher st on s.id = st.stu_id on teacher t
           on st.tea_id = t.id