003自动注入+Spring加载properties文件+单例设计模式+声明式事务+ajax复习

一.自动注入

在spring配置文件中对象名和ref="id"id名相同使用自动注入,可以不配置<property/>。

两种配置方法①在<bean>中通过autowire=""配置,只对这个<bean>生效。②在<beans>中通过default-autowire=""配置,表当前文件中所有<bean>都是全局配置内容。

autowire=""可取值。default,默认值,根据全局default-autowire=""值,默认全局和局部都没有配置情况下,相当于no。no,不自动注入。byName,通过名称自动注入,在spring容器中找类的id。byType,根据类型注入,spring容器中不可以出现两个相同类型的<bean>。constructor,根据构造方法注入,根据对应参数的构造方法(构造方法参数中包含注入对戏那个),底层使用byName,构造方法参数名和其他<bean>的id相同。

二.Spring加载properties文件

Spring中加载properties文件:①在src下新建xxx.properties文件。②在spring配置文件中先引入xmlns:context,如果需要记载多个配置文件逗号分隔。③添加了属性文件并且在<beans>中开启自动注入注意的地方,SqlSessionFactoryBean的id不能叫做sqlSessionFactory,修改应该把原来通过ref引用替换成value赋值,自动注入只能影响ref,不会影响value赋值。

<context:property-placeholder location="classpath:db.properties,classpath:second.properties"/>
<!-- 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.bjsxt.mapper"></property>
    <property name="sqlSessionFactoryBeanName" value="factory"></property>
</bean>

在Spring管理的类中通过@Value("${key}")取出properties中内容:①添加注解扫描。②在类中添加,key和变量名可以不相同,变量类型任意,只要保证key对应的value能转换成这个类型就可以。

<context:component-scan base-package="com.bjsxt.service.impl"></context:component-scan>
@Value("${my.demo}")
private String test;

scope属性:<bean>的属性,作用是控制对象有效范围(单例,多例等)。<bean/>标签对应的对象默认都是单例的,无论获取多少次都是同一个对象。scope可取值,session默认值单例,prototype多例每次重新实例化,session每个会话对象内对象是单例的,application在application对象内是单例,global session spring推出的一个对象,依赖于spring-webmvc-portlet,类似于session。

三.单例设计模式

作用是在应用程序有保证最多只能有一个实例。好处是提升运行效率,实现数据共享,案例application对象。

懒汉式,对象只有被调用时才去创建,由于添加了锁所以导致效率低。

public class SingleTon {
	//由于对象需要被静态方法调用,把方法设置为static
	//由于对象是static,必须要设置访问权限修饰符为private ,如果是public可以直接调用对象,不执行访问入口
	private static SingleTon singleton;
	/**
	 * 方法名和类名相同
	 * 无返回值.
	 * 其他类不能实例化这个类对象
	 * 对外提供访问入口
	 */
	private SingleTon(){}
	/**
	 * 实例方法,实例方法必须通过对象调用
	 * 设置方法为静态方法
	 * @return
	 */
	public static SingleTon getInstance(){
		//添加逻辑如果实例化过,直接返回
		if(singleton==null){
			//多线程访问下,可能出现if同时成立的情况,添加锁
			synchronized (SingleTon.class) {
				//双重验证
				if(singleton==null){
					singleton = new SingleTon();
				}
			}
			
		}
		return singleton;
	}
}

饿汉式,解决了懒汉式中多线程访问可能出现同一个对象和效率低的问题。

public class SingleTon {
	private static SingleTon singleton = new SingleTon();
	private SingleTon(){}
	public static SingleTon getInstance(){
		return singleton;
	}
}

四.声明式事务

编程式事务,由程序员编程事务控制代码,OpenSessionInView编程式事务。声明式事务,事务控制代码已经由spring写好,程序员只需要声明出哪些方法需要进行事务控制和如何进行事务控制。

声明式事务都是针对于ServiceImpl类下方法的。事务管理器基于通知(advice)的。在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" 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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd"
	default-autowire="byName">
    <!-- 数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	<property name="driverClassName" value="${jdbc.driver}"></property>
    	<property name="url" value="${jdbc.url}"></property>
    	<property name="username" value="${jdbc.username}"></property>
    	<property name="password" value="${jdbc.password}"></property>
    </bean>
    <!-- SqlSessinFactory对象 -->
    <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="typeAliasesPackage" value="com.bjsxt.pojo"></property>
    </bean>
    <!-- 扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    	<property name="basePackage" value="com.bjsxt.mapper"></property>
    	<property name="sqlSessionFactoryBeanName" value="factory"></property>
    </bean>
    <!-- spring-jdbc.jar中 -->
    <bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 配置声明式事务 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<!-- 哪些方法需要有事务控制 -->
			<!-- 方法以ins开头事务管理 -->
			<tx:method name="ins*" />
			<tx:method name="del*"/>
			<tx:method name="upd*"/>
			<tx:method name="*" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<!-- 切点范围设置大一些 -->
		<aop:pointcut expression="execution(* com.bjsxt.service.impl.*.*(..))"
			id="mypoint" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" />
	</aop:config>
</beans>

声明式事务中属性解释

name=""哪些方法需要有事务控制,支持*通配符。

readonly="boolean"是否是只读事务,如果为true告诉数据库事务为只读事务,数据化优化会对性能有一定的提升,所以只要是查询的方法,建议使用此数据;如果为false(默认值),事务需要提交的事务,建议新增删除修改。

propagation控制事务传播行为:①当一个具有事务控制的方法被另一个有事务控制的方法调用后,需要如何管理事务(新建事务?在事务中执行?把事务挂起?报异常?)。②REQUIRED(默认值),如果当前有事务就在事务中执行,如果当前没有事务就新建一个事务。③SUPPORTS,如果当前有事务就在事务中执行,如果当前没有事务就在非事务状态下执行。④MANADATORY,必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务就报错。⑤REQUIRES_NEW,必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务就把当前事务挂起。⑥NOT_SUPPORTED,必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起。⑦NEVER,必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错。⑧NESTED,必须在事务状态下执行,如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务。

isolation=""事务隔离级别:在多线程或并发访问下如何保证访问到的数据具有完整性的。

①脏读,一个事物(A)读取到另一个事务(B)中未提交的数据,另一个事务中数据可能进行了改变,此时A事务读取的数据可能和数据库中数据是不一致的,此时认为数据是脏数据,读取脏数据过程叫做脏读。②不可重复度,主要针对的是某行数据(或某行中的某列),主要针对的操作是修改操作,两次读取在同一个事务中,当事务A第一次读取事务后,事务B对事务A读取的数据进行修改,事务A中再次读取的数据和之前读取的数据不一致,过程不可重复度。③幻读,主要针对的操作是新增或删除,两次事务的结果,事务A按照特定条件查询出结果,事务B新增了一条符合条件的数据,事务A中查询的数据和数据库中的数据不一致的,事务A好像出现了幻觉,这种情况称为幻读。

DEFAULT,默认值,由底层数据库自动判断应该使用什么隔离级别。READ_UNCOMMITTED,可以读取未提交数据,可能出现脏读,不重复读,幻读,效率最高。READ_COMMITTED,只能读取其他事务已提交数据,可以防止读脏数据,可能出现不可重复读和幻读。REPEATABLE_READ,读取的数据被添加锁,防止其他事务修改此数据,可以防止不可重复读。脏读,可能出现幻读。SERIALIZABLE,排队操作时整个表添加锁,一个事务在操作数据时,另一个事务等待操作完成后才能操作这个表,最安全的效率最低的。

rollback-for="异常类型全限定路径",当出现什么异常时需要进行回滚,建议给定该属性值。

no-rollback-for="",当出现什么异常时不回滚事务。

Spring中常用注解

@Component,创建类对象,相当于配置<bean/>。@Service与@Component功能相同,写在数据访问层类上。@Controller与@Component功能相同,写在控制器类上。@Resource,不需要写对象的get/set方法,java中的注解,默认按照byName注入,如果没有名称对象,按照byType注入,建议把对象名称和spring容器中对象名相同。@Autowired,不需要写对象的get/set方法,spring的注解,默认按照byType注入。@Value()获取properties文件中内容。@Pointcut()定义切点。@Aspect()定义切面类。@Before()前置通知。@After后置通知。@AfterReturning后置通知,必须切点正确执行。@AfterThrowing异常通知。@Arround环绕通知。

五.ajax复习

标准请求响应时浏览器的动作(同步操作),浏览器请求什么资源,跟随显示什么资源。ajax异步请求,局部刷新,通过异步请求,请求到服务器资源数据后,通过脚本修改页面中部分内容。ajax由javascript推出的,由jquery对js中ajax代码进行的封装,达到使用方便的效果。

jquery中ajax的分类

第一层:$.ajax({属性名:值,属性名:值}),是jquery中功能最全的,代码写起来最麻烦的。

第二层(简化$.ajax):$.get(url,data,success,dataType),$.post(url,data,success,dataType)。

第三层(简化$.get()):$.getJSON(url,data,success)相当于设置$.get中的dataType="json",$.getScript(url,data,success)相当于设置$.get中的dataType="script"。

如果服务器返回数据是从表中取出,为了方便客户端 操作返回的数据,服务器端返回的数据设置成json,客户端把json当做对象或数组操作。

json数据格式

JsonObject,json对象,理解成java中对象{"key":value,"key":value}

JsonArray,json数组,[{"key":value,"key":value},{"key":value,"key":value}]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
	/*
	url: 请求服务器地址
	data:请求参数
	dataType:服务器返回数据类型
	error请求出错执行的功能
	success请求成功执行的功能,function(data) data服务器返回的数据.
	type:请求方式
	*/
	$("a").click(function(){
		$.ajax({
			url:'demo',
			data:{"name":"张三"},
			dataType:'html',
			error:function(){
				alert("请求出错.")
			},
			success:function(data){
				alert("请求成功"+data)
			},
			type:'POST'
		});
		$.post("demo",{"name":"张三"},function(data){
			var result="";
			for(var i =0 ;i<data.length;i++){
				result+="<tr>";
				result+="<td>"+data[i].id+"</td>"
				result+="<td>"+data[i].username+"</td>"
				result+="<td>"+data[i].password+"</td>"
				result+="</tr>";
			}
			//相当innerHTML先清空后添加
			$("#mytbody").html(result);
		})
		return false;
	})
});
</script>
</head>
<body>
<a href="demo">跳转</a>
<table border="1">
	<tr>
		<td>编号</td>
		<td>姓名</td>
		<td>密码</td>
	</tr>
	<tbody id="mytbody"></tbody>
</table>
</body>
</html>
@WebServlet("/demo")
public class DemoServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("执行控制器");
		String name = req.getParameter("name");
		Users users1 = new Users();
		users1.setId(1);
		users1.setPassword("123");
		users1.setUsername("张三");
		Users users2 = new Users();
		users2.setId(2);
		users2.setPassword("456");
		users2.setUsername("李四");
		
		List<Users> list = new ArrayList<Users>();
		list.add(users1);
		list.add(users2);
		
		ObjectMapper mapper = new ObjectMapper();
		String result = mapper.writeValueAsString(list);
		
		resp.setContentType("application/json;charset=utf-8");
		PrintWriter out = resp.getWriter();
		out.println(result);
		out.flush();
		out.close();
	}
}
发布了23 篇原创文章 · 获赞 7 · 访问量 1787

猜你喜欢

转载自blog.csdn.net/weixin_44145972/article/details/102573124