spring学习笔记
@component 给不属于以上几层的组件添加这个注解
使用注解将组件假如到容器中需要几步
1)给要添加的组件标上四个注解中的一个
2)、告诉spring, 自动扫描添加了注解的注解依赖context名称空间
3)、一定要导入aop包,支持加注解的模式
组件的作用域是单例的。
@AutoWired原理:
1)、先按照类型去容器中找到对应的组件:找到一个直接赋值;没找到抛出异常;找到多个?装配上?
a、按照变量名作为id继续匹配。BookService、BookServiceExt
a、没有匹配上,报错 原因
Spring中可以使用带泛型的父类类型来确定这个子类的类型
vv
有的时候可以阅读一下源码........
AOP:面对切面编程
指在程序运行期间,将某段代码动态的切入到指定的方法到指定的位置进行运行的这种编程方式,面向切面编程
解决的问题是:业务逻辑(核心功能)与辅助功能高度耦合
将某段代码(日志)动态的切入(不把日志代码写死在业务逻辑方法中)到指定的方法(加减乘除)的指定位置(方法的开始、结束和异常.....)进行运算的这种编程方式(spring 简化了面向切面技术)
aop专业术语:
@Aspect 声明是aop切面类
@After(execution(public int com.moguidongdong.impl.MyClass.methodName(int, int))) 通知置前(方法全类名)
@After(execution(public int com.moguidongdong.impl.MyClass.*(int, int))) 通知置前(该类的所有方法)
@After(execution(public int com.moguidongdong.impl.My*.*(int, int))) 通知置前(以My开头的类的所有方法)
@After(execution(public int com.moguidongdong.impl.My*ss.*(int, *))) 通知置前(以My开头、ss结尾的类的所有方法; 第一个参数为int,第二个参数为任意)
@After(execution(public int com.moguidongdong.impl.MyClass.methodName(..))) 通知置前(参数为任意:任意个、任意类型)
@Before @After @AfterThrowing @AfterReturning
正常执行:@Before(前置通知) =====> @After(后置通知) =====> @AfterReturning(正常返回)
异常处理: @Before(前置通知) =====> @After(后置通知) =====> @AfterThrowing(方法异常)
细节4:我们可以在通知方法运行的时候,拿到目标方法的详细信息;
1)、只需要为通知方法的参数列表写上一个参数: JoinPoint joinPoint (它封装了当前目标方法的详细信息)
joinPoint.getArgs();//拿到方法的参数集
joinPoint.getSignature();//拿到方法的标签 -----> joinPoint.getSignature().getName();//拿到方法的方法名(也可以拿到方法的修饰符、返回类型)
细节5:如果出异常,想拿到异常信息,包括方法正常返回的时候拿到返回结果
@After(value=execution(public int com.moguidongdong.impl.MyClass.methodName(int, int)), returning="result")
@After(value=execution(public int com.moguidongdong.impl.MyClass.methodName(int, int)), throwing="exception")
Spring 对通知方法的要求不严格;唯一要求的就是参数列表一定不能乱写?
--> 通知方法是spring利用反射调用的,每次方法调用得确定这个方法的参数列表的值; 参数表上的每一个参数,spring都得知道是什么!
joinPoint:知道是什么,假如来一个Object那么spring就不知道是什么了,所以得准确的告诉它才不会出错
抽取可重用的切入点表达式(改一处就全给改了)
1、随便声明一个没有实现的返回void的方法
2、给方法上标注@Pointcut(execution(public int com.moguidongdong.impl.MyClass.methodName(int, int)))
@Around, 环绕 :是Spring中最强大的通知
@Around, 环绕 :动态代理
四合一通知就是环绕通知,环绕通知有一个参数,环绕通知是优于普通通知的执行顺序
@Order(1) @Order可以调整切面的顺序,在多个切面同时切某个方法时,环绕通知只能影响当前切面。假如说某个方法具有1、2、3 3个切面,但是切面1加了环绕通知,那么环绕通知只影响切面1,不会影响切面2、3
AOP使用的场景:1、 AOP加日志保存到数据库 2、AOP做权限验证; 3、AOP做安全检查 4、AOP做事务控制
基于注解的AOP步骤:1、 将目标类和切面类都加入到ioc容器中. @Component 2、告诉spring那个是切面类. @Aspect 3、在切面中使用五个通知注解来配置切面中的这些通知方法都何时何地的运行 4、开启基于注解的AOP功能
基于配置的AOP步骤:
<!-- myid是目标类的一个实例; myid1、myid2是切面类的一个实例 -->
<bean id="myid" class="com.kenneth.ClassName"></bean>
<bean id="myid1" class="com.kenneth.ClassName1"></bean>
<bean id="myid2" class="com.kenneth.ClassName2"></bean>
<aop:config>
<aop:pointcut expression="execution(public int com.moguidongdong.impl.My*ss.*(int, *))" id="pointcut"/>
<aop:aspect ref="myid1" order="2">
<aop:pointcut expression="execution(public int com.moguidongdong.impl.My*ss.*(int, *))" id="mypointcut"/>
<aop:before method="myid1-before" pointcut="execution(public int com.moguidongdong.impl.MyClass.methodName(int, int))"/>
<aop:after-returning method="myid1-returning" pointcut-ref="mypointcut" returnning="result"/>
<aop:after-throwing method="myid1-throwing" pointcut-ref="mypointcut" returnning="result"/>
<aop:after method="myid1-end" pointcut="execution(public int com.moguidongdong.impl.MyClass.methodName(int, int))"/>
</aop:aspect>
<aop:aspect ref="myid2">
<aop:pointcut expression="execution(public int com.moguidongdong.impl.My*ss.*(int, *))" id="mypointcut"/>
<aop:before method="myid2-before" pointcut="pointcut"/>
<aop:after-returning method="myid2-returning" pointcut-ref="mypointcut" returnning="result"/>
<aop:after-throwing method="myid2-throwing" pointcut-ref="mypointcut" returnning="result"/>
<aop:after method="myid2-end" pointcut="execution(public int com.moguidongdong.impl.MyClass.methodName(int, int))"/>
<aop:around method="myid2-around" pointcut="mypointcut"/>
</aop:aspect>
</config>
注解:快速方便 配置:功能完善;重要的用配置,不重复的用注解

浙公网安备 33010602011771号