w88_w88优德官网中文版手机_w优德88亚洲

w88优德官网中文版手机_优德888娱乐场_优德888官网手机版下载

admin6个月前248浏览量

Spring 根据IOC容器办理Bean的办法,使得其有才能对IOC容器中的一切Bean进行无限或许的操作,Spring AOP是根据 IOC容器的高档特性,凭借与AOP能完结一些可插拔模块,而不影响原有体系的规划.

本节结合Spring Boot 在一个已有的Web项目中运用AOP供给一种后续的日志弥补计划.更多关于IOC容器的概念请查询相关资源,附件中供给AOP学习的扼要笔记,仅供参阅

Spring Boot 程序主类 ZkClientApplication, 考虑到该类的注解现已"足够多",当然根据Java注解的装备办法是不可避免的,决定在保护一个装备类ZkClientConfiguration,相关代码如下:

ZkClientApplication.java ,该类中仅是Spring Boot +Spring Cloud 相关的装备,无须重视.

@SpringBootApplication
// 启用REST 客户端
@EnableFeignClients
// 启用客户端负载均衡
@RibbonClient(name = "my", configuration = RibbonConfig.class)
// 启用服务发现
@EnableDiscoveryClient
// 启用断路器
@EnableHystrix
@ComponentScan("cn.com.xiaofen")
public class ZkClientApplication {
public static void main(String[] args) {
SpringApplication.run(ZkClientApplication.class, args);
}
/* Spring JDBC */
@Bean
public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

/* TOMCAT DataSourcePool */
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}

ZkClientConfiguration.java ,注解@EnableAspectJAutoProxy启用Spring对AOP的支撑并答应经过注解的办法界说AOP实例.

@Configuration
// 启用AOP注解特性
@EnableAspectJAutoProxy
public class ZkClientConfiguration {

  • 本接方针是完结对cn.com.xiaofen.controller 包下的控制器的拜访进行监控,记载拜访的行为,当然如果有一种可行的思路,那就有无限或许.项目包成果如下:

在log包下界说RequestLog.java 用于界说AOP切面并切入一切controller包下的类打印拜访日志,这儿并没有杂乱的操作,实际上在出产环境中日志能够有更高档的处理办法如一致发送到音讯体系kafka,mq等一致处理.

RequestLog.java , 源码如下,稍后做简略的答疑.

@Aspect
@Component
public class RequestLog {
public static final Log log = LogFactory.getLog(RequestLog.class);

// defined aop pointcut
@Pointcut("execution(* cn.com.xiaofen.controller.*.*(..))")
public void controllerLog() {
}

// log all of controller
@Before("controllerLog()")
public void before(JoinPoint joinPoint) {
log.info(joinPoint.getSignature().getDeclaringType() + ",method:" + joinPoint.getSignature().getName()
+ ",params:" + Arrays.asList(joinPoint.getArgs()));
}

// result of return
@AfterReturning(pointcut = "controllerLog()", returning = "retVal")
public void after(JoinPoint joinPoint, Object retVal) {
System.out.println(retVal);
}

}

@Aspect 声明当时类赋予一个界面的特别使命,@Component 注解是为了让当时类的实例为IOC容器感知, Spring IOC容器会主动查看加载@Aspect 标识的实例以提取界说的AOP特性.

在运用AOP之前需求定一个PointCut 切断,即那详细到哪些办法能够被切面切入. @Pointcut("execution(* cn.com.xiaofen.controller.*.*(..))") 注解标识的办法界说了一个PointCut 界说了cn.com.xiaofen.controller 包下一切类的恣意数量参数的办法. 引证该切断的办法为当时办法名 +() 即可.

@Before("controllerLog()") 界说前置告诉,是AOP的根本单元即切点,即在掉用方针办法之前处理一些操作, 注解标示的办法中能够运用JoinPoint 来拜访当时正要拜访的办法的签名信息等.此处获取了类名,办法名,以及提交的参数信息等,正是进行日志打印所需求的.

@AfterReturning 界说回来告诉,办法钓用完毕,能够获取到方针办法履行的成果.其它可参阅附件

附件:

一、String AOP编程

.AOP(Aspect-Orientrd Programming,面向切面编程),是一种新的办法论,是对传统OOP(Object Oriented Programming,面向方针编程)的弥补。

.AOP 的首要编程方针是切面(aspect) ,而切面模块化横切重视点

.在引证AOP编程时,任然需求界说公共功用,但能够清晰界说这个功用在哪里,以什么办法运用,而且不修正受影响的类,这样一来横切重视点就被模块化到特俗的方针(切面)里

.AOP的优点

.每个事物逻辑坐落一个方位,代码不涣散,便于晋级和保护

.事务模块愈加简练,只包括中心事务代码

二、AOP术语

.切面(Aspect),横切重视点(跨过运用程序多个模块的功用)被模块化的特别方针

.告诉(Advice),切面必需求完结的作业

.署理(Proxy),向方针方针运用告诉之后创立的方针

.@链接点(Joinpoint) 程序履行的某个特定方位

.@切点(Pointcut) 每个类具有多个连接点

三、Spring AOP

.AspectJ:Java社区里最完好最盛行的AOP结构

.在Spring2.0以上版别中,能够运用AspectJ注解或根据XML装备AOP

1.Spring中启用AspectJ

.参加Spring 的 jar && AspectJ jar && aopalliance-1.0.jar

spring-aop-4.2.3.RELEASE.jar

spring-aspects-4.2.3.RELEASE.jar

spring-beans-4.2.3.RELEASE.jar

spring-context-4.2.3.RELEASE.jar

spring-core-4.2.3.RELEASE.jar

spring-expression-4.2.3.RELEASE.jar

commons-logging-1.2.jar

aspectjrt.jar

aspectjtools.jar

aspectjweaver.jar

org.aspectj.matcher.jar

.在Spring装备文件中参加AOP的命名空间

.xmlns:aop="http://www.springframework.org/schema/aop"

.根据注解的装备

.

.把横切重视点的代码笼统到切面的类中

.将切面参加IOC容器中

.@Component

.声明为切面

.@Aspect

.声明告诉

.声明一个办法

.@Before -->前置告诉,在办法履行之前履行

.@Before("execution(public void cn.com.zjf.hello.Hello.*(String ))")

.@After -->后置告诉,在办法履行之后履行

.@AfterRunning -->回来告诉,在办法回来成果之后履行

.@AfterThorwing -->反常告诉,在办法抛出反常之后

.@Around -->盘绕告诉,围绕着办法履行

**运用办法签名编写AdpectJ 切入点表达式

.execution * com.zjf.hello.*(..):

.第一个 * 代表恣意修饰符及恣意回来值.

.第二个 * 代表恣意办法. .. 匹配恣意数量的参数.

.若方针类与接口与该切面在同一个包中, 能够省掉包名.

.execution public String hello.*(double, ..)

.匹配第一个参数为 double 类型的办法,

^.. 匹配恣意数量恣意类型的参数

**能够在告诉的办法中参加 JoinPoint joinPoint 来获取告诉的细节

.public void beforeMethod(JoinPoint joinPoint){}

.@After 后置告诉

.同前置告诉

.不能方针拜访办法的回来成果

.@AfterReturning

.回来告诉,办法正常履行时的告诉

.能够拜访方针办法的回来值

.@AfterThrowing

.反常告诉,办法反常履行后的告诉

.能够拜访反常信息,及详细的反常方针

.@Around

.盘绕告诉

. @Around(value="execution(* cn.com.zjf.hello.Hello.*(String ))")

public void afterAroundMethod(ProceedingJoinPoint pjp){

2.指定切面的优先级

.@Order(1) -->值越小优先级越高

3.重用切入点表达式

.增加一个办法用来声明切入点表达式,该办法中不在需求参加其它的代码

.运用@PointCut来声明切入点表达式

.@Pointcut(value="execution(* cn.com.zjf.hello.Hello.*(String ))")

public void declareJoinPointExpression(){

}

.后边的其他切入点运用办法名来引证

.@Before("declareJoinPointExpression()")

.不同包中能够运用包名.类名.办法名()来拜访

4.根据装备文件的办法来装备AOP

.装备切面的Bean

.

.运用 装备AOP

.装备切点表达式

.

.装备切面及告诉

.

最终

Java高档材料需求自己收取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程!!!

点击了解更多,获取更多Java高档进阶材料!!!