利用自定义注解,反射,cglib代理实现spring框架的IOC

发布于:2024-07-04 ⋅ 阅读:(161) ⋅ 点赞:(0)

        对比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>


网站公告

今日签到

点亮在社区的每一天
去签到