package com.spring.aop;
public interface MathCalculator {
public int add(int a,int b);
public int sub(int a,int b);
}
1.2 定义实现类
定义实现类,除了进行运算,还要打印简单的日志功能:
package com.spring.aop;
public class NonAopMathCalculator implements MathCalculator {
@Override
public int add(int a, int b) {
System.out.println("方法执行前参数是:"+a+","+b);
int result = a+b;
System.out.println("方法执行后结果是:"+result);
return result;
}
@Override
public int sub(int a, int b) {
System.out.println("方法执行前参数是:"+a+","+b);
int result = a-b;
System.out.println("方法执行后结果是:"+result);
return result;
}
}
1.3 测试
package com.spring.aop;
public class MathCalculatorTest {
public static void main(String[] args) {
MathCalculator mathCalculator = new NonAopMathCalculator();
int add = mathCalculator.add(9, 6);
System.out.println("加法计算结果:"+add);
int sub = mathCalculator.sub(9, 6);
System.out.println("减法计算结果:"+sub);
}
}
package com.spring.aop;
public class MathCalculatorImpl implements MathCalculator {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
}
package com.spring.aop;
public class MathCalculatorProxyTest {
public static void main(String[] args) {
//创建被代理对象
MathCalculatorImpl mathCalculatorImpl = new MathCalculatorImpl();
//创建代理对象
MathCalculatorProxyImpl mathCalculatorProxy = new MathCalculatorProxyImpl(mathCalculatorImpl);
MathCalculator proxy = mathCalculatorProxy.getLoggingProxy();
int add = proxy.add(9, 6);
System.out.println("加法计算结果:"+add);
int sub = proxy.sub(9, 6);
System.out.println("减法计算结果:"+sub);
}
}
打印结果:
[before] The method add begins with [9, 6]
[after] The method ends with 15
加法计算结果:15
[before] The method sub begins with [9, 6]
[after] The method ends with 3
减法计算结果:3
package com.spring.aspectjAop.annotation;
public interface MathCalculator {
public int add(int a, int b);
public int sub(int a, int b);
}
package com.spring.aspectjAop.annotation;
import org.springframework.stereotype.Component;
@Component("mathCalculator")
public class MathCalculatorImpl implements MathCalculator {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
}
•
注解类型的 value属性表示哪些类是当前引入通知的目标. value 属性值也可以是一个 AspectJ类型的表达式, 以将一个即可引入到多个类中. defaultImpl属性中指定这个接口使用的实现类
引入通知示例代码:
3.3.2 基于xml配置文件使用AspectJ实现AOP
1、业务接口和业务实现类
package com.spring.aspectAop.xml;
public interface MathCalculator {
public int add(int a, int b);
public int sub(int a, int b);
}
package com.spring.aspectAop.xml;
import org.springframework.stereotype.Component;
public class MathCalculatorImpl implements MathCalculator {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
}
2、切面类
package com.spring.aspectAop.xml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
public class LoggingAspectJAop {
public void beforeMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List args = Arrays.asList(joinPoint.getArgs());
System.out.println("执行的方法是:"+methodName+",参数是:"+args);
}
public void afterMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List args = Arrays.asList(joinPoint.getArgs());
System.out.println(methodName+"执行完了");
}
public void afterRunningMethod(JoinPoint joinPoint, Object result){
String methodName = joinPoint.getSignature().getName();
List args = Arrays.asList(joinPoint.getArgs());
System.out.println(methodName+"方法的返回值是:"+result);
}
public void afterThrowableMethod(JoinPoint joinPoint, Exception exception){
String methodName = joinPoint.getSignature().getName();
List args = Arrays.asList(joinPoint.getArgs());
System.out.println(methodName+"方法的出现了异常,异常信息是:"+exception.getMessage());
}
public Object aroundMethod(ProceedingJoinPoint pjd){
Object result = null;//定义返回值
String methodName = pjd.getSignature().getName();
List args = Arrays.asList(pjd.getArgs());
try {
//前置通知
System.out.println(methodName+"方法执行之前,参数是:"+args);
result = pjd.proceed();
//后置通知
System.out.println(methodName+"方法执行完成,结果是:"+result);
} catch (Throwable throwable) {
//异常通知
System.out.println(methodName+"方法执行出现了异常,异常信息:"+throwable.getMessage());
throw new RuntimeException(throwable);
}
//返回通知
System.out.println(methodName+"执行没有发生异常,一切正常返回,返回结果是:"+result);
return result;
}
}
3、配置文件
4、测试
package com.spring.aspectAop.xml;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext-xml.xml");
MathCalculator mathCalculator = (MathCalculator) applicationContext.getBean("mathCalculator");
int add = mathCalculator.add(9, 3);
System.out.println("加法结果:"+add);
int sub = mathCalculator.sub(9, 3);
System.out.println("减法结果:"+sub);
}
}
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
public class Singleton {
}
/*
* 懒汉模式。注意,getInstance如果在多线程环境中调用,需要加上synchronized,否则存在线程不安全问题
*/
class LazySingleton
这个月公司安排我一个人做iOS客户端开发,由于急着用,我先发布一个版本,由于第一次发布iOS应用,期间出了不少问题,记录于此。
1、使用Application Loader 发布时报错:Communication error.please use diagnostic mode to check connectivity.you need to have outbound acc
/*
2013年3月15日15:16:24
malloc 就memory(内存) allocate(分配)的缩写
本程序没有实际含义,只是理解使用
*/
# include <stdio.h>
# include <malloc.h>
int main(void)
{
int i = 5; //分配了4个字节 静态分配
int * p
http://wiki.sdn.sap.com/wiki/display/BOBJ/Optimize+query+with+Query+Stripping+in+Web+Intelligence
and a very straightfoward video
http://www.sdn.sap.com/irj/scn/events?rid=/library/uuid/40ec3a0c-936