JAVA-Spring AOP基础 – 代理设计模式
- 2019 年 10 月 3 日
- 筆記
????IOC DI???????????????????????????????????????????“???”???????????????????????
1 @Service 2 public class UserServiceImpl implements UserService { 3 @Autowired 4 private UserDao userDao; 5 6 @Override 7 public void registUser(User user) { 8 try { 9 System.out.println("???????"); 10 System.out.println("???????"); 11 System.out.println("???????"); 12 userDao.addUser(user); 13 System.out.println("???????"); 14 } catch (Exception e) { 15 System.out.println("????"); 16 e.printStackTrace(); 17 } 18 } 19 20 @Override 21 public void upToVIP(User user) { 22 try { 23 System.out.println("???????"); 24 System.out.println("???????"); 25 System.out.println("???????"); 26 userDao.updateUser(user); 27 System.out.println("???????"); 28 } catch (Exception e) { 29 System.out.println("????"); 30 e.printStackTrace(); 31 } 32 33 } 34 35 @Override 36 public void removeUser(User user) { 37 try { 38 System.out.println("???????"); 39 System.out.println("???????"); 40 System.out.println("???????"); 41 userDao.deleteUser(user.getId()); 42 System.out.println("???????"); 43 } catch (Exception e) { 44 System.out.println("????"); 45 e.printStackTrace(); 46 } 47 } 48 49 }
??????????????????????????????????????
????????
??????????????
?????????????????????????????????????????????????????
???????????????????? ?????????????????????????????????????????????????????????????????????????? –??spring???????????????
1 package cn.tedu.staticproxy; 2 public interface SJSkill { 3 public void ?(); 4 public void ??(); 5 } 6 7 package cn.tedu.staticproxy; 8 public class FBB implements SJSkill{ 9 public void ?(){ 10 System.out.println("fbb?????"); 11 } 12 public void ??(){ 13 System.out.println("fbb?????"); 14 } 15 } 16 17 package cn.tedu.staticproxy; 18 public class JJRStaticProxy implements SJSkill{ 19 20 private FBB fbb = new FBB(); 21 22 @Override 23 public void ?() { 24 System.out.println("????????????"); 25 fbb.?(); 26 System.out.println("????????????????"); 27 } 28 29 @Override 30 public void ??() { 31 System.out.println("????????????"); 32 fbb.??(); 33 System.out.println("????????????????"); 34 } 35 36 } 37 38 package cn.tedu.staticproxy; 39 import org.junit.Test; 40 public class StaticProxyTest { 41 @Test 42 public void test01(){ 43 JJRStaticProxy jjr = new JJRStaticProxy(); 44 jjr.?(); 45 jjr.??(); 46 } 47 }
??????-jdk???????
???jdk?????????????????????????????????????????????????????????????????jdk??api????????
??java????????
???????????????????????????????????????????????????????????
???????java?????????????????????????????????????????????????????????????????????????????????????????????java??????????????????????????????????
?????
1 package cn.tedu.javaproxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import org.junit.Test; 8 9 public class JavaProxyTest { 10 @Test 11 public void test01(){ 12 13 //???? 14 final FBB fbb = new FBB(); 15 16 //java?????? ??fbb???? 17 /** 18 * classLoader:?????????????????????????????? 19 * interfaces: ?????????????????????????????????????????????? 20 * invocationHandler: ????????????????????????????????????invoke??? 21 * ???????????????????????????????????????????????????????? 22 */ 23 SJSkill proxy = (SJSkill) Proxy.newProxyInstance(FBB.class.getClassLoader(),FBB.class.getInterfaces() 24 ,new InvocationHandler() { 25 @Override 26 /** 27 * proxy: ??? 28 * method:????????? 29 * args:???????????? 30 */ 31 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { 32 if("???".equals(method.getName())){ 33 System.out.println("????????????~~"); 34 return null; 35 }else{ 36 System.out.println("????????"); 37 Object returnObj = method.invoke(fbb, args); 38 System.out.println("????????"); 39 return returnObj; 40 } 41 } 42 }); 43 //????????????????????????????????? 44 //fbb.?(); 45 //fbb.??(); 46 proxy.?(); 47 proxy.??(); 48 proxy.???(); 49 } 50 }
????java????????
????
??????-????cglib???????
????CGLIB??????????????????????????????????
????CGLIB??????????????????????????????????????????????????????
????CGLIB????????
????????????????????????????????????
????????????????????????????????????????????
?????
?????????CGLIB????spring-core-3.2.3.RELEASE.jar
?????????????spring?????CGLIB
1 package cn.tedu.cglibproxy; 2 3 import java.lang.reflect.Method; 4 5 import org.junit.Test; 6 import org.springframework.cglib.proxy.Enhancer; 7 import org.springframework.cglib.proxy.MethodInterceptor; 8 import org.springframework.cglib.proxy.MethodProxy; 9 10 public class CglibProxyTest { 11 @Test 12 public void test01(){ 13 final FBB fbb = new FBB(); 14 15 //??? 16 Enhancer enhancer = new Enhancer(); 17 18 //???? -- ????????????????????? ??cglib???????????????????? 19 enhancer.setInterfaces(fbb.getClass().getInterfaces()); 20 21 //???? -- ????????????cglib????????????????????????????????? 22 enhancer.setSuperclass(fbb.getClass()); 23 24 //?????? -- ??????????????????????????????????????????????????????????? 25 enhancer.setCallback(new MethodInterceptor() { 26 @Override 27 public Object intercept(Object proxy, Method method, Object[] args, 28 MethodProxy methodProxy) throws Throwable { 29 if("???".equals(method.getName())){ 30 System.out.println("???????~~~"); 31 return null; 32 }else{ 33 System.out.println("???????"); 34 Object returnObj = method.invoke(fbb, args); 35 System.out.println("???????"); 36 return returnObj; 37 } 38 } 39 }); 40 41 //?????? 42 FBB proxy = (FBB) enhancer.create(); 43 proxy.?(); 44 proxy.??(); 45 proxy.???(); 46 } 47 }
??CGLIB????????
??????????????? “???” ????
1 package cn.tedu.em.service; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 import cn.tedu.em.dao.UserDao; 7 import cn.tedu.em.domain.User; 8 9 @Service 10 public class UserServiceImpl implements UserService { 11 12 @Autowired 13 private UserDao userDao; 14 15 public void upToVIP(User user){ 16 userDao.updateUser(user); 17 } 18 19 public void removeUser(User user){ 20 userDao.deleteUser(5); 21 } 22 23 public void registUser(User user){ 24 userDao.addUser(user); 25 } 26 } 27 28 29 package cn.tedu.em.service; 30 31 import java.lang.reflect.Method; 32 33 import org.springframework.beans.factory.annotation.Autowired; 34 import org.springframework.beans.factory.annotation.Qualifier; 35 import org.springframework.cglib.proxy.Enhancer; 36 import org.springframework.cglib.proxy.MethodInterceptor; 37 import org.springframework.cglib.proxy.MethodProxy; 38 import org.springframework.stereotype.Service; 39 40 @Service 41 public class UserServiceImplCglibProxy { 42 43 @Autowired 44 @Qualifier("userServiceImpl") 45 private UserService userService; 46 47 public UserServiceImplCglibProxy() { 48 49 } 50 51 public UserService getCglibProxy() { 52 Enhancer enhancer = new Enhancer(); 53 enhancer.setInterfaces(userService.getClass().getInterfaces()); 54 enhancer.setSuperclass(userService.getClass()); 55 enhancer.setCallback(new MethodInterceptor() { 56 @Override 57 public Object intercept(Object proxy, Method method, Object[] args, 58 MethodProxy mproxy) throws Throwable { 59 try { 60 System.out.println("???????"); 61 System.out.println("???????"); 62 System.out.println("???????"); 63 64 Object returnObj = method.invoke(userService, args); 65 66 System.out.println("???????"); 67 return returnObj; 68 } catch (Exception e) { 69 System.out.println("????"); 70 e.printStackTrace(); 71 throw new RuntimeException(e); 72 } 73 } 74 }); 75 return (UserService) enhancer.create(); 76 } 77 } 78 79 package cn.tedu.em.web; 80 81 import org.springframework.beans.factory.annotation.Autowired; 82 import org.springframework.stereotype.Controller; 83 84 import cn.tedu.em.domain.User; 85 import cn.tedu.em.service.UserServiceImplCglibProxy; 86 87 @Controller 88 public class RegistServlet { 89 90 @Autowired 91 //private UserService userService; 92 //private UserServiceImplJavaProxy proxy; 93 private UserServiceImplCglibProxy proxy; 94 public void regist(){ 95 User user = new User(1,"LK","????","4192@qq.com"); 96 //proxy.getJavaProxy().upToVIP(user); 97 proxy.getCglibProxy().upToVIP(user); 98 } 99 }