1. Understanding AOP Proxies
- org.zcs.springAop-AopMain.java
package org.zcs.springAop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.zcs.springAop.service.FactoryService;
import org.zcs.springAop.service.ShapeService;
public class AopMain {
public static void main(String[] args) {
FactoryService factoryService = new FactoryService();
ShapeService shapeservice =(ShapeService) factoryService.getBean("shapeService");
shapeservice.getCircle() ;
}
}
- org.zcs.springAop.aspect - LoggingAble.java
package org.zcs.springAop.aspect;
public @interface LoggingAble {
}
- org.zcs.springAop.aspect - LoggingAspect.java
package org.zcs.springAop.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.zcs.springAop.model.Circle;
@Aspect
public class LoggingAspect {
public Object myAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
Object returnvalue = null;
try {
System.out.println("Before advice");
returnvalue = proceedingJoinPoint.proceed();
System.out.println("After Returning.");
} catch (Throwable e) {
System.out.println("After Throwing");
}
System.out.println("After finally.");
return returnvalue;
}
public void loggingAdvice() {
System.out.println("Logging from the advice.");
}
}
- org.zcs.springAop.model-Circle.java
package org.zcs.springAop.model;
public class Circle {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println(" Circle's setter be called." );
throw(new RuntimeException());
}
public String setNameReturn(String name) {
this.name = name;
System.out.println(" Circle's setter be called." );
return name;
}
}
- org.zcs.springAop.model-Triangle.java
package org.zcs.springAop.model;
public class Triangle {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- org.zcs.springAop.service-FactoryService.java
package org.zcs.springAop.service;
import org.zcs.springAop.model.Circle;
import org.zcs.springAop.model.Triangle;
public class FactoryService {
public Object getBean(String beanType) {
if(beanType.equals("shapeService")) return new ShapeServiceProxy();
if(beanType.equals("circle")) return new Circle();
if(beanType.equals("triangle")) return new Triangle();
return null;
}
}
- org.zcs.springAop.service-ShapeService.java
package org.zcs.springAop.service;
import org.zcs.springAop.aspect.LoggingAble;
import org.zcs.springAop.model.Circle;
import org.zcs.springAop.model.Triangle;
public class ShapeService {
private Circle circle;
private Triangle triangle;
@LoggingAble
public Circle getCircle() {
System.out.println("This is a Circle getter's methods");
return circle;
}
public void setCircle(Circle circle) {
this.circle = circle;
}
public Triangle getTriangle() {
return triangle;
}
public void setTriangle(Triangle triangle) {
this.triangle = triangle;
}
}
- org.zcs.springAop.service-ShapeServiceProxy.java
package org.zcs.springAop.service;
import org.zcs.springAop.aspect.LoggingAspect;
import org.zcs.springAop.model.Circle;
public class ShapeServiceProxy extends ShapeService {
public Circle getCircle() {
new LoggingAspect().loggingAdvice();
return super.getCircle();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean name="triangle" class = "org.zcs.springAop.model.Triangle">
<property name="name" value = "Triangle name"></property>
</bean>
<bean name = "circle" class = "org.zcs.springAop.model.Circle">
</bean>
<bean name="shapeService" class="org.zcs.springAop.service.ShapeService" autowire = "byName"></bean>
<bean name= "loggingAspect" class = "org.zcs.springAop.aspect.LoggingAspect"></bean>
<aop:config>
<aop:aspect id = "loggingAspect" ref = "loggingAspect">
<aop:around pointcut = "execution( public * get*())" method="myAroundAdvice"/>
</aop:aspect>
</aop:config>
</beans>
2.学习记录
- 学习了Aop的代理过程,使之代码的逻辑性增加了许多。