ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:424.48KB ,
资源ID:18392584      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18392584.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring学习笔记3Word文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring学习笔记3Word文档格式.docx

1、 Proxy proxy = new Proxy(landlord); proxy.rent(); 1.1. 代理对象特征1. 实现和被代理者相同的接口(房东的接口)2. 代替目标对象完成相应的功能。3. 目标方法完成之后,会完成额外的操作。2. 静态代理场景设计我们的数据库操作需要事务的控制,add update del 等方法都需要添加事务。例子:发现问题:在Servic 代码的分离。1.实现和被代理者相同的接口2.注入需要的属性目标对象中的代码只处理业务相关的工作,实现了代码的分离代理类中的代码: 代理类中的代码静态代理模式 缺点: 1、一个service对应一个代理类,那么100个se

2、rvice对应100个代理类 2、代理类的每一个方法中都需要填写事务的开启和事务的提交,复用性不高 3、代理类不具备通用性3. 动态代理3.1. 动态代理的种类:3.2. 动态代理的实现public class BeanFactoryProxy public static Object getProxy(final Object target,final TransactionManager tx) Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInt

3、erfaces(), new InvocationHandler() Override public Object invoke(Object proxy, Method method, Object args) throws Throwable Object result = null; String methodName = method.getName(); /对于需要添加事务的代码认为进行控制 if(methodName.equals(add) | methodName.equals(delupdate) try tx.begin(); result = method.invoke(t

4、arget, args); mit(); catch(Exception e) tx.rollback(); else /不需要添加事务的代码直接执行 result = method.invoke(target, args); return result; ); return proxy;测试代码:Test public void test01() ApplicationContext context = new ClassPathXmlApplicationContext(applicationContext.xml /得到目标对象 UserService target = (UserSer

5、vice) context.getBean(target /得到事务对象 用来做事务操作 TransactionManager tx = (TransactionManager) context.getBean(tx /得到代理对象 UserService userService = (UserService) BeanFactoryProxy.getProxy(target, tx); /查看对象的类型 System.out.println(userService.getClass(); userService.find();动态代理模式优缺点:优点:1. 实现了代码的分离2. 实现了代码的

6、重复利用,原来每个方法上都需要添加事务,现在只需添加一遍。缺点:1. 只能处理事务,不具有通用性 (日志,安全,权限)2. 使用jdk的动态代理必须实现接口,否则不能生成代理对象。3. 目标类的每个方法都经过判断降低性能。3.3. Cglib动态代理不需要实现接口也可以生成代理对象,并且代理对象是目标类的子类 public class BeanFactoryProxy /第一步:创建增强器对象 Enhancer enhancer = new Enhancer(); /第二步:注入目标类的接口 /enhancer.setInterfaces(target.getClass().getInterf

7、aces(); /第三步:设置父类(目标对象) enhancer.setSuperclass(target.getClass(); /第四步: enhancer.setCallback(new MethodInterceptor() Override public Object intercept(Object proxy, Method method, Object args, MethodProxy methodProxy) throws Throwable Object result = null; try tx.begin(); method.invoke(target, args);

8、 mit(); catch(Exception e) e.printStackTrace(); tx.rollback(); return result; ); return enhancer.create();4. Spring生成代理对象说明:Spring也整合了代理模式JDK代理实现的接口InvocationHandlerCGLIB代理实现的接口是MethodInterceptor所以Spring为了代码的服用也进行了接口的抽象MethodInterceptor是aopalliance.jar这个包下的,spring实现该接口可以自由切换代理模式。springProxyBean代码如下/

9、这是一个事物的通知类public class SpringTransactionProxy implements MethodInterceptor private TransactionManager tx; public void setTx(TransactionManager tx) this.tx = tx; public Object invoke(MethodInvocation method) throws Throwable try tx.begin(); method.proceed(); /如果有下一个通知,继续执行通知,如果没有通知,就会执行目标方法 mit(); ca

10、tch(Exception e) tx.rollback(); return null;配置文件 bean id=userDao class=dao.UserDaoImplservice.UserServiceImpl -配置通知类 -transaction.TransactionManagertxAdviceadvice.SpringTransactionProxy-配置用来产生代理对象的工厂 默认使用jdk的代理模式-userServiceorg.springframework.aop.framework.ProxyFactoryBean-1.指明代理需要实现的接口 -interfaces

11、 service.UserService/list-2.指明一个目标类 -targetName value=- -3.指名通知类 -interceptorNamestxAdviceproxyTargetClasstrueSpring代理工厂的缺点1.目标陪如果有多个,就会有多个代理类,每个代理类都要重新配置,给配置文件带来了麻烦。Spring2.5以后就解决的这样的问题5. Spring AOP 面向切面编程5.1. 名词解释5.1.1. 切面(Aspect)用来完成某些特定功能的类(例如事务处理的类)切面包括: 日志,安全性处理的类,权限控制,系统中抽象的通用的类。5.1.2. 连接点(Jo

12、inPoint):客户端调用的方法。5.1.3. 通知(Advice):完成某些特定功能的方法就是通知5.1.4. 切入点(PointCut):If判断条件就是切入点,只有满足切入点,切面才有效,并且通知和目标方法相结合。5.1.5. 目标对象(Target):正真执行目标方法的类5.1.6. AOP代理对象(Proxy)客户端调用都是代理对象代理对象:1.jdk的动态代理,要求必须实现接口。 2.cglib的动态代理,不需要实现接口,并且代理对象是目标对象的子类。5.1.7. 织入(Wearing):代理对象的方法体,用来连接通知和目标对象。5.2. 通知的概念1.前置通知:目标方法之前执行

13、的通知 接口MehtodInterc2.后置通知:目标方法之后执行的通知3.异常通知:目标方法抛出异常后执行的通知4.最终通知:切面最后执行的通知(必然会执行finally)。5.环绕通知:目标方法执行前后执行的通知。5.3. AOP实现实现步骤:1.导入相关jar包2.编写配置文件的头(导入schema约束)3.编写目标类4.编写切面和通知5.配置切入点表达式6.配置xml配置文件(关联切面)5.3.1. 导入相关jar包一共5个jar包前两个是和Spring整合的jar包,spring依赖第三方的三个jar包。spring-aop.jarspring-aspects.jaraopallia

14、nce.jaraspectjrt.jaraspectjweaver.jar5.3.2. AOP配置文件头?xml version=1.0 encoding=UTF-8beans xmlns=http:/www.springframework.org/schema/beans xmlns:context=/www.springframework.org/schema/contextutil=/www.springframework.org/schema/utilaop=/www.springframework.org/schema/aopxsi=/www.w3.org/2001/XMLSchem

15、a-instance xsi:schemaLocation= /www.springframework.org/schema/beans http:/www.springframework.org/schema/beans/spring-beans-3.2.xsd/www.springframework.org/schema/context /www.springframework.org/schema/context/spring-context-3.2.xsd/www.springframework.org/schema/util /www.springframework.org/sche

16、ma/util/spring-util-3.2.xsd/www.springframework.org/schema/aop /www.springframework.org/schema/aop/spring-aop-3.2.xsd/beans5.3.3. 添加schema约束配置方法和之前的相同5.3.4. 编写目标类public class OrderServiceImpl implements OrderService private OrderDao orderDao; public void setOrderDao(OrderDao orderDao) this.orderDao

17、= orderDao; Override public void add() orderDao.add(); public void del() orderDao.del(); public void update() orderDao.update(); public void find() orderDao.find();目标类2public class UserServiceImpl implements UserService private UserDao userDao; public void setUserDao(UserDao userDao) this.userDao =

18、userDao; userDao.add(); userDao.del(); userDao.update(); userDao.find();5.3.5. 编写切面和通知开关事物具体代码public class TransactionManager public void begin()事物开始 public void commit()事物提交 public void rollback()事物回滚通知类具体编辑代码public class TxAdvice implements MethodInterceptor public Object invoke(MethodInvocation m

19、i) throws Throwable mi.proceed();5.3.6. 切入点表达式aop:pointcut expression=within(service.*) id=txPointcut/Within()表达式 只能匹配到类级别Within(包名.类名) 只匹配包下的一个类Within(包名.*) 匹配包下的所有类(不包括子包下的)Within(service.*) 匹配这个包下的所有类,包括子孙包Execution()表达式 能匹配到方法级别(具体到方法) execution(返回值 包名.类名.方法(参数类型)例子1:pointcut expression=executio

20、n(int service.UserServiceImpl.add()改切点表达式表示 返回值为int 包名类名serviceUserServiceImpl 方法为add()的匹配规则例子2:execution(* service.*.add()规则:返回值值任意, 包名service下子类的add(),只能包含一层,子孙类不行。例子3:pointcutexpression=execution(* service.*.add()方法返回值任意, service包下的所有子孙类的add()例子4:execution(* service.*.add(int,String)返回值的类型任意 service子孙包下的add方法参数类型为int,String execution(* service.*.add(.)id=返回值类型任意 service下的所有子孙类.add方法() (参数任意)5.3.7. 配置xml配置文件-1.配置目标类 -orderDaodao.OrderDaoImplorderServiceservice.OrderServiceImpl-2.配置通知类 -advice.TxAdviceprope

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1