对比jdk代理,cglib不用实现任何接口,使用的范围更宽广。cglib实质上是创建了目标对象类的子类对象。
使用自定义注解MyService和MyTransactional代替spring框架提供的注解@Service @Transactional
创建自定义注解类MyService
创建自定义注解类MyTransactional
在测试类AnnotationTest和测试方法上使用自定义注解
创建cglib的切面内容SqlsessionUtil
实现对业务层事务的管理
创建代替IOC的SpringBeanFactory类
用于添加自定义注解后生产代理对象。
public class SpringBeanFactory { private static Map<String,Object> map = new HashMap<>(); public static Object get(String key){ return map.get(key); } public static void put(Class c) throws InstantiationException, IllegalAccessException { MyService myService = (MyService) c.getAnnotation(MyService.class); String objName = null; if (myService==null)return; System.out.println("objName = " + myService); String value = myService.value(); // System.out.println("value = " + value); // System.out.println(value.equals(null)); // System.out.println(value.equals("")); // System.out.println(value.equals(" ")); if (value.equals("")){ objName = c.getName().substring(c.getName().lastIndexOf('.')+1).substring(0,1).toLowerCase()+c.getName().substring(c.getName().lastIndexOf('.')+1).substring(1); }else {objName = myService.value();} System.out.println("objName = " + objName); Object o1 = Enhancer.create(c, new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { MyTransaction myTransaction = method.getAnnotation(MyTransaction.class); if ( myTransaction == null)return methodProxy.invokeSuper(o, objects); try { Object o2 = methodProxy.invokeSuper(o, objects); SqlsessionUtil.commit(); return o2; } catch (Throwable e) { SqlsessionUtil.rollback(); throw new RuntimeException(e); } finally { SqlsessionUtil.close(); } } }); // Object o = c.newInstance(); map.put(objName,o1); } }
SpringBeanFactory类的具体实现:
首先类中有一个属性map用于存储添加了自定义注解创建出来的代理对象。
get方法是用来根据名字获取代理对象。
put方法是根据类的反射获取的类信息来创建代理对象和名字。
map集合和get方法:
put方法:
1)给对象起名字
2)创建代理对象
在测试类中调用基于注解创建的测试类AnnotationTest对象,执行其中的方法
cglib jar包:
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency>