模拟spring注入mybatis原理【重写spring】

思路
通过注解拦截到需要进行数据持久化操作的类,获取所所携带的注解信息,及dao层接口的请求路径,通过工厂创建实例注入到所需的类中

步骤
1构建所需的注解
mapper注解,用于注册dao层接口

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Mapper {
    public String name() default "";
}

Dbsupport注解,用于注入mybatis实例

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dbsupport {
    public   String mapperName() default "";
}

2在dao层中进行mapper注解将其注册到baen仓库

@Mapper(name="testMapper")
public interface testMapper {
      public  String getUser();
}

3在需要调用dao层的目标类中进行Dbsupport注解,注入依赖

@Service(name="testService")
public class testService {
    @Dbsupport(mapperName="testMapper")
    public testMapper mapper;

    public String getUser(){
        String user="";     
           try{
                System.out.println("service="+mapper.getUser());
                user=mapper.getUser();
                }catch(Exception e
                        ){ 
                    System.out.println(e);
                }
        return user;
    }
}

4,核心,依赖注入操作
首先根据配置文件建立一个session对象

  //mybatis的配置文件
            String resource = "conf.xml";
            //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
            InputStream is = SocketHandler.class.getClassLoader().getResourceAsStream(resource);
            //构建sqlSession的工厂
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = sessionFactory.openSession();

然后根据拦截到的注解信息,生成session所需的映射类生成session类实例化后注入到目标类

        //获取目标类的所有属性
                            Field[] field2 = class2.getDeclaredFields();
                            if(field2 != null&&field2.length>0){  
                                 for(Field fie2 : field2){  
                                     if(fie2.isAnnotationPresent(Dbsupport.class)){
                                      Dbsupport dbsupport=fie2.getAnnotation(Dbsupport.class);
                                     //获取mapperName
                                      String  dbame= dbsupport.mapperName();
                                      String DbName="";
                                      //通过mapperName在bean仓库获取到对应的mapper类名
                                      DbName = (String) SummerBeanCreat.beanMap.get(dbame);
                                      if(DbName!=null&&DbName.length()>0){
                                          //通过mapper类名获取对应的mapper类
                                            Class class3 = Class.forName(DbName);
                                            Object obj=session.getMapper(class3);
                                             //注入
                                            try{
                                            fie2.set(Injectobj , obj);}
                                            catch(Exception e){
                                                System.out.println(e);
                                            }
                                          }
                                     }
                                     } 
                            }

5请求结束后关闭session

        Method m = c.getMethod(methodName, Map.class);
                String respondMsg=  (String) m.invoke(class1, paramMap);
                System.out.println("返回值"+respondMsg);
                FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(respondMsg  
                        .getBytes()));  
                response.headers().set(CONTENT_TYPE, "text/plain");  
                response.headers().set(CONTENT_LENGTH, response.content().readableBytes());  
                response.headers().set(CONNECTION, Values.KEEP_ALIVE); 
                session.close();
                ctx.writeAndFlush(response); 

效果
通过ajax发送http请求

function sendhttp(){
     $.ajax({
         type: "GET",
         url: "http://localhost:8989/testaction/testmethod",
         data: {
             param1:"123",
             param2:"321"
         },
         dataType:'jsonp',
         async: false,
         success: function(data){
        console.log(data)
         }
           });
}

对应的sql文

<mapper namespace="summer.mapper.testMapper" >




        <select id="getUser"   resultType="String">
         select
         passWord
         from
         userInfo
        </select>

</mapper> 

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39168678/article/details/80537110
今日推荐