脚本宝典收集整理的这篇文章主要介绍了SpringAOP-动态代理,日志注入,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
1.AOP定义? 用来干啥的? 怎么用?(怎么跑通它的思路)
为啥要学代理模式? -- 因为是SpringAop的底层
原有的代码不敢动,一动就是Bug,。所以使用代理可以做很多事,
角色分析:
代理模式的好处:1.可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
缺点:
操作步骤---1,接口-->真实角色--》代理角色--》客户端访问代理
静态代理这么麻烦,每次重写人家的很多方法???---怎么解决代码多---动态代理
个人理解代理:无非是在原有的基础上,进行一层封装,这样既能使用被代理人的方法,也能实现自我的灵活安排!
动态代理
它两结合返回的proxyInstance---Proxy.newProxyInstance
至于被代理人方法,使用invoke操作
目的:生成一个代理对象,并执行被代理人方法
交互--被代理人方法,以及生成代理对象,提供一个调用代理人对象的方法
1.被代理人的方法的获取,必须要获取到被代理人的对象
2.生成代理对象,必须要依托于代理人的方法(接口)以及它的加载器(要不jvm处理不了)
建立一个动态代理
目的:生成一个代理对象,并执行被代理人方法
交互--被代理人方法,以及生成代理对象,提供一个调用代理人对象的方法
package com.zjz.ProxyMethod;
/*
* 目的:生成一个代理对象,并执行被代理人方法
* 交互--被代理人方法,以及生成代理对象,提供一个调用代理人对象的方法
* 1.被代理人的方法的获取,必须要获取到被代理人的对象
* 2.生成代理对象,必须要依托于代理人的方法(接口)以及它的加载器(要不jvm处理不了)
*
* */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Object target; // 被代理的人-对象
public void setTarget(Object target) {
this.target = target;
}
// 调用代理人对象的方法,以及生成代理对象
public Object getProxy(){
Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxyInstance;
}
// 被代理人方法
@override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行"+method.getName()+"方法---");
Object result = method.invoke(target, args); // 此时执行被代理人的方法
return result;
}
}
关于代理中为啥自动运行invoke,而且不可缺少
Proxy.newProxyInstance 执行时会生成一个创建出一个类$Proxy0,此类中调用invoke
如果少了还会执行,但是咱们的代理对象没有方法了。。
Object result = method.invoke(被代理对象的接口, args); // 执行 被代理对象的接口方法,,invoke
每走一步,对照代理模式
提供声明式事务;允许用户自定义切面
1.导包
【重点】使用AOP织入,需要导入一个依赖包!
<!-- https://mvnreposITory.COM/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
2.目的
目的:将日志,或者其它玩意,,切入到要执行的接口中
使用代理模式:怎么用? 你依据API写好你要切的东西,然后交给ApplicationContext去做(定位!配置你写的)
为啥交给间接管理员,服务者。。。你要在大的生态里整东西就是靠它。。
关键:ApplicationContext怎么做,,,,要切的东西怎么写
要切的东西怎么写;
配置:关键!!
<aop:config>
中 <!--方式1,使用Spring API接口-->
<!--配置AOP,需要导入AOP的约束-->
<aop:config>
<!--切入点 exPression:表达式 execution(要执行的位置!* * * * *)-->
<aop:pointcut id="pointcut" expression="execution(* com.zjz.serivce.UserServiceImpl.*(..))"/>
<!-- 执行环绕增强!-->
<aop:advisor advice-ref="LOG" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
目的:将日志,或者其它玩意,,切入到要执行的接口中
使用代理模式:怎么用? 你写好你要切的东西(自己编的),然后交给ApplicationContext去做(定位!配置你写的)
为啥交给间接管理员,服务者。。。你要在大的生态里整东西就是靠它。。
关键:ApplicationContext怎么做,,,,要切的东西怎么写
要切的东西怎么写;
public class DIYPointCut {
public void before(){
System.out.println("=======方法执行前=======");
}
public void after(){
System.out.println("=======方法执行后=======");
}
}
配置
1.约束,资源导入 aop的
2.我们自己编写bean导入,
3.aop配置 <aop:config>
中
<aop:aspect ref="diy">
<!--方式2:自定义类-->
<bean id="diy" class="com.zjz.diy.DiyPointCut"/>
<aop:config>
<aop:aspect ref="diy">
<!--切入点-->
<aop:pointcut id="point" expression="execution(* com.zjz.serivce.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
1.自己写一个加注解的类
// 使用注解方式实现AOP
@Aspect // 标注这个类是一个切面
public class AnnotationPointCut {
@Before("execution(* com.zjz.serivce.UserServiceImpl.*(..))")
public void before(){
System.out.println("======方法执行前=====");
}
@After("execution(* com.zjz.serivce.UserServiceImpl.*(..))")
public void after(){
System.out.println("=====方法执行后=====");
}
// 在环绕增强中,我们可以给定一个参数,代表我们要处理切入的点
@Around("execution(* com.zjz.serivce.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint pj) throws Throwable {
System.out.println("环绕前---");
// 获得签名
Signature signature = pj.getSignature();
System.out.println(signature);
// 执行方法
Object proceed = pj.proceed();
System.out.println(proceed);
System.out.println("环绕后---");
}
配置
1.约束,资源导入 aop的
2.我们自己编写bean导入,
3.开启注解支持
<!--方式3 注解配置-->
<bean id="annotationPointCut" class="com.zjz.diy.AnnotationPointCut"/>
<!--开启注解支持-->
<aop:aspectj-autoproxy/>
以上是脚本宝典为你收集整理的SpringAOP-动态代理,日志注入全部内容,希望文章能够帮你解决SpringAOP-动态代理,日志注入所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。