java——Spring

Posted lzj-learn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java——Spring相关的知识,希望对你有一定的参考价值。

技术图片

 

 

 技术图片

 

 

 技术图片

 

 

 技术图片

 

 

 通知:

技术图片

 

 

 

 

技术图片

 

 

 

 

技术图片

 

 

 技术图片

 

 

 aspect:把某个类作为切面类,如下,MoocAspect类即为切面类

技术图片

 

 

 切入点:

技术图片技术图片

 

 等等

例如:

技术图片

 

 这个表示切入点为biz包下所有后缀为“Biz”类里的所有方法;切面为MoocAspect类;

 

advisor(通知):例:

技术图片

 

 前置通知,在切面类里定义好before方法;

在定义通知方法中,比较特殊的是arround Advice,应该该通知方法的第一个参数必需是ProceedingJoinPoint类型的,如:

技术图片

 

 技术图片

 

 结果:

技术图片

 

 其中打印出的bIz表示的则是业务类的内容,实现了环绕通知

 

 

如果要绑定某个方法进行环绕通知,需要在配置时指定所环绕方法的参数类型与参数名称:

技术图片

 

 且在切面类中定义环绕方法aroundInit时也需要在第一个ProceedingJoinPoint类型参数后添加相应的参数:

技术图片

 

 这样就实现了环绕通知方法对某个具体方法的通知,且可以避免因重方法名导致的指定不一的问题

 

 

advice各个通知的顺序:

技术图片

 、

 

 

为了给业务类提供新增的方法:

技术图片

 

 

 配置如下

技术图片

 

 

 types-matching:表示所对应的业务类

implement-interface:表示所要引用的接口

default-impl:表示所要引用接口的实例类

测试的时候:

技术图片

 

 

 这样就可以调用到FitImpl接口实现类里的方法filter()了。

注意:

技术图片

 

 

 

 

 

aop:aspect与aop:advisor的区别

实现方式不同

< aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。

 技术图片

 

 

 这个就是advisor实现前通知和后通知需要继承的接口;以下是配置:

<bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>
 
<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
</aop:config>
 
<bean id="human" class="com.ghs.aop.Human"/>

这个是正常的aspect的配置:

<bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean>
 
<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:aspect ref="sleepHelperAspect">
        <!--前置通知-->
        <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/>
        <!--后置通知-->
        <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/>
    </aop:aspect>
</aop:config>
 
<bean id="human" class="com.ghs.aop.Human"/>

 

用aspect切面类里的方法就无需继承Advice类,而只需要定义好指定的方法beforeSleep和afterSleep就好;

使用场景不同

< aop:advisor>大多用于事务管理。 

 例如:

<!-- 会重复读,不会脏读事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" />
    </tx:attributes>
</tx:advice>
 
<aop:config proxy-target-class="true">
    <aop:pointcut id="txPointCut" expression="..."/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>

而< aop:aspect>大多用于日志,缓存

 

 

AOP各种API

技术图片

 

 技术图片

 

 技术图片

 

以上是关于java——Spring的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

在Scala项目中使用Spring Cloud

java代码在片段活动中不起作用