Java代码体切面 java切面实现

Java配置切面的几种方式你都知道吗

演示5种方式配置文件AOP

创新互联是专业的称多网站建设公司,称多接单;提供成都网站建设、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行称多网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

1. bean class="cn.hncu.spring4x.aop.Cat" id="cat"/bean

!-- 切点 --

bean class="org.springframework.aop.support.JdkRegexpMethodPointcut" id="pointcut"

property name="pattern" value=".*run.*"/property

/bean

!-- 通知 ,要自己写--

bean class="cn.hncu.spring4x.aop.AroundAdvice" id="advice"/bean

!-- 切面=切点+通知 --

bean class="org.springframework.aop.support.DefaultPointcutAdvisor" id="advisor"

property name="advice" ref="advice"/property

property name="pointcut" ref="pointcut"/property

/bean

bean class="org.springframework.aop.framework.ProxyFactoryBean" id="catProxide"

property name="target" ref="cat"/property

property name="interceptorNames"

list

valueadvisor/value

/list

/property

/bean

2. bean class="cn.hncu.spring4x.aop.Cat" id="cat"/bean

!-- 切面=切点+通知 (把切点和通知写成内部bean)--

bean class="org.springframework.aop.support.DefaultPointcutAdvisor" id="advisor"

property name="advice"

bean class="cn.hncu.spring4x.aop.AroundAdvice"/bean

/property

property name="pointcut"

bean class="org.springframework.aop.support.JdkRegexpMethodPointcut"

property name="patterns"

list

value.*run.*/value

value.*say.*/value

/list

/property

/bean

/property

/bean

bean class="org.springframework.aop.framework.ProxyFactoryBean" id="catProxide"

property name="target" ref="cat"/property

property name="interceptorNames"

list

valueadvisor/value

/list

/property

/bean

3.bean class="cn.hncu.spring4x.aop.Cat" id="cat"/bean

!--//直接在切面bean中配置“切点的正则表达式”,省去“切点bean”的配置 用到这个类 org.springframework.aop.support.RegexpMethodPointcutAdvisor --

bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="advisor"

property name="advice"

bean class="cn.hncu.spring4x.aop.AroundAdvice"/bean

/property

property name="patterns"

list

value.*run.*/value

/list

/property

/bean

bean class="org.springframework.aop.framework.ProxyFactoryBean" id="catProxide"

property name="target" ref="cat"/property

property name="interceptorNames"

list

valueadvisor/value

/list

/property

/bean

4. bean class="cn.hncu.spring4x.aop.Cat" id="cat"/bean

!--//直接在切面bean中配置“切点的正则表达式”,省去“切点bean”的配置 用到这个类 org.springframework.aop.support.RegexpMethodPointcutAdvisor --

bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="advisor"

property name="advice"

bean class="cn.hncu.spring4x.aop.AroundAdvice"/bean

/property

property name="patterns"

list

value.*run.*/value

/list

/property

/bean

!-- 自动代理 --

bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/bean

5. bean class="cn.hncu.spring4x.aop.Cat" id="cat"/bean

!--//直接在切面bean中配置“切点的正则表达式”,省去“切点bean”的配置 用到这个类 org.springframework.aop.support.RegexpMethodPointcutAdvisor --

bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="advisor"

property name="advice"

bean class="cn.hncu.spring4x.aop.AroundAdvice"/bean

/property

property name="patterns"

list

value.*run.*/value

/list

/property

/bean

!-- 自动代理 --

bean class="cn.hncu.spring4x.aop.MyAutoProxy"/bean

使用java语言,如何对一个类中的静态方法做切面编程?

aop的事务代理机制最重要的放心是确定切入点,面,通知.具体看代码,下面是在spring中配置的我自己写的一个异常处理的aop作用类 ,该配置切入面在于在controller包下的所有类的所有注解为aspect的切面类,通知类型为表示在目标方法之前切入,切入点为controller包下的所有类所有方法.至于楼主所说的静态方法对于事务机制应该没什么区别吧,只要用within方法一样可以的

!-- 定义共同处理组件 --

bean id="loggerBean"

class="org.tedu.cloudnote.aspect.LoggerBean"

/bean

!-- 将loggerBean组件切入到Controller方法上 --

aop:config

!-- 要切入哪个共同处理组件,ref指定共同组件id值 --

aop:aspect ref="loggerBean"

!-- aop:before表示在目标方法之前切入,

method指定方法名;pointcut指定目标组件 --

aop:before method="logController"

pointcut="within(org.tedu.cloudnote.controller..*)"/

/aop:aspect

/aop:config

之后这个bean所定义的 自定义类的代码如下 ,希望楼主给个采纳,如果问友喜欢,也可以给我个赞哦,摸摸大

package org.tedu.cloudnote.aspect;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.springframework.stereotype.Component;

//封装共同处理的组件

@Component//扫描,等价于bean定义

@Aspect//等价于aop:aspect ref=""

public class LoggerBean {

//要在Controller.execute开始位置切入

//方法规则:public void 方法名(){...} (前置通知)

@Before("within(org.tedu.cloudnote.controller..*)")

//等价于aop:before method="logController" pointcut=""

public void logController(){

System.out.println("进入Controller组件处理");

}

}

java怎么运用切面编程生成日志

1.首先创建一个自定义注解拦截Controller类,代码如下

/**

* 自定义注解 拦截Controller

*/

@Target({ ElementType.PARAMETER, ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface ControllerLog {

String desc() default "";//标示默认打印空

}

2.创建一个打印日志的切面类,引入切面注解@Aspect,

新建方法代码如下:

// Controller层切点

@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")

public void recordLog() {

}

@Around("recordLog()")

public Object around(ProceedingJoinPoint pjp) throws Throwable {

// ExPatternParser.initLogger();

long start = System.currentTimeMillis();

Object[] args = pjp.getArgs();

String remark = this.getControllerMethodDescription(pjp);

Object retVal = null;

try {

retVal = pjp.proceed();

} catch (Throwable e) {

// TODO Auto-generated catch block

logger.error("请求失败" + e.toString(),e);

remark = remark + "。Exception Cause By " + e.toString();

throw e;

}finally{

long end = System.currentTimeMillis();

long cost = end - start;

//打印访问日志

// Controller中所有方法的参数,前两个分别为:Request,Response

if(args != null args.length 0){

Object o = args[0];

if(o instanceof HttpServletRequest){

HttpServletRequest request = (HttpServletRequest) args[0];

PrintLog.visit(request, cost,remark);

}

}

}

return retVal;

}

/**

* 获取注解中对方法的描述信息 用于Controller层注解

* @param joinPoint切点

* @return 方法描述

* @throws Exception

*/

public static String getControllerMethodDescription(ProceedingJoinPoint joinPoint)

throws Exception {

String targetName = joinPoint.getTarget().getClass().getName();

String methodName = joinPoint.getSignature().getName();

Object[] arguments = joinPoint.getArgs();

Class targetClass = Class.forName(targetName);

Method[] methods = targetClass.getMethods();

String description = "";

for (Method method : methods) {

if (method.getName().equals(methodName)) {

Class[] clazzs = method.getParameterTypes();

if (clazzs.length == arguments.length) {

ControllerLog controllerLog = method.getAnnotation(ControllerLog.class);

if(controllerLog !=null){

description =

controllerLog.desc();

}

break;

}

}

}

return description;

}

3.然后在每个Controller类上加上注解:

@ControllerLog(desc = "要 打印的日志内容")

java切点和切面讲解,主要是干什么的,有什么作用,省代码?高效?务必通俗易懂,跪谢

切点和通知构成切面;比如现在你想在所有的save方法前加一些相同代码,那你的切点就是save前,然后通知就是你所加的代码,而这两个整体构成一个切面,当你那天突然觉得这段代码需要改一下,那你就可以直接改通知内容,结果是开发效率变高,代码量减少,耦合度降低,你可以参考声明式事务的配置方式来梳理这部分知识,会快一点


当前标题:Java代码体切面 java切面实现
网页路径:http://cdiso.cn/article/ddodsjg.html

其他资讯