动态代理

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情
代理对象UserServiceProxy 
import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class UserServiceProxy implements InvocationHandler{

//继承接口

private Object object;//声明一个对象
 
public UserServiceProxy(Object object) { 

//创建对象构造函数,方便赋值

this.object = object; 

} 

@Override 
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //实现接口对象方法

System.out.println("开始登录"); //添加事件

Object o = method.invoke(object, args); //利用反射执行原始方法

System.out.println("结束登录"); //添加事件

return o; //返回原始对象结果

}
}

测试

public class Test {

public static void main(String[] args) { 

//真实调用的方法 

UserServiceImpl serviceImpl = new UserServiceImpl(); 

//创建代理对象 

UserServiceProxy proxy = new UserServiceProxy(serviceImpl); 

//返回真实的代理对象 

UserService service = (UserService) Proxy.newProxyInstance(serviceImpl.getClass().getClassLoader(), serviceImpl.getClass().getInterfaces(), proxy); 

service.a(); //执行方法

}

}
原始对象

public class UserController {

 UserService userService; 

 public String loginDo() { 

 userService.login("", "");

 return null; 
 }
}
面向切面编程:事物 Spring的核心,是对面向对象思维的有力补充
web.xml

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

 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd"

 <aop:aspectj-autoproxy/>
import org.aspectj.lang.ProceedingJoinPoint;
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.springframework.stereotype.Component;
@Component
@Aspect//织入
public class PointCut {

//切入点 

@Pointcut("execution (public !void com.UserServiceImpl.*(..))") 
public void userssss() { } 

//之前执行 

@Before("userssss()")


public void before() {
 
System.out.println("开始执行"); 

} 

//* finally的时候执行  
  
@After("userssss()") 
public void after() { 

System.out.println("after"); 

} 

//* 返回的时候执行    
@AfterReturning("userssss()") 
public void afterReturning() { 

System.out.println("afterReturning"); 

} 

//* 抛异常的时候执行 

@AfterThrowing("userssss()") 
public void afterThrowing() { 

System.out.println("afterThrowing"); 

} 

//* 之前之后都执行 

@Around("userssss()") 
public void around(ProceedingJoinPoint pjp) throws Throwable { 

System.out.println("around-之前"); 

pjp.proceed(); 

System.out.println("around-之后"); 

  } 
}