抽取出的BaseService,以及实现类中调用的原理

来源:互联网 发布:cf网络异常重新登录 编辑:程序博客网 时间:2024/05/20 16:35

有些公用的方法,不用去每一个都去实现类中写对应的方法。


package com.cris.scm.service.impl;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;import com.cris.scm.dao.AccountMapper;import com.cris.scm.dao.BaseMapper;import com.cris.scm.dao.SupplierMapper;import com.cris.scm.entity.Page;import com.cris.scm.service.BaseService;public class BaseServiceImpl<T> implements BaseService<T> {protected BaseMapper<T> basedao;@Autowiredprivate SupplierMapper supplierdao;@Autowiredprivate AccountMapper accountdao;@PostConstruct//在构造方法执行之后执行private void initBaseMapper() throws Exception{//完成以下逻辑,需要对研发本身进行命名与使用规范//this关键字指对象本身,这里指的是调用此方法的实现类(子类)System.out.println("==========this-->"+this);System.out.println("======父类的基本信息-->"+this.getClass().getSuperclass());System.out.println("父类和泛型的信息-->"+this.getClass().getGenericSuperclass());//得到父类的泛型信息ParameterizedType type=(ParameterizedType) this.getClass().getGenericSuperclass();//获取第一个参数的class//Type typetmp[]=type.getActualTypeArguments();//拿到尖括号里面的泛型,因为不止一个,所以是数组//for(Type tmp:typetmp){//System.out.println(tmp);//}Class clazz=(Class) type.getActualTypeArguments()[0];//得到泛型 com.cris.scm.entity.具体的pojoSystem.out.println("====第一个参数的class"+clazz);//转化为属性名,第一个字母转成小写//com.cris.scm.entity.Supplier.class->supplier+daoString localField=clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"dao";//例如 basedaoSystem.out.println("=======localString-->"+localField);//getDeclaredField 获得所有属性,包括私有和保护//通过下面的方法获得到父类的声明属性Field field=this.getClass().getSuperclass().getDeclaredField(localField);//例如,得到supplierdao属性System.out.println("=====field-->"+field);System.out.println("=====field对应的对象-->"+field.get(this));//得到一个代理对象,代理这个SupplierMapper接口//supplierserviceimpl引用的是一个代理对象?org.apache.ibatis.binding.MapperProxy@367970fa//得到父类的basedao属性Field baseField=this.getClass().getSuperclass().getDeclaredField("basedao");System.out.println("baseField"+baseField);System.out.println("=====baseField对应的对象-->"+baseField.get(this));//field.get(this)获取当前this的field字段的//值。例如:Supplier对象中,baseMapper所指向//的对象为其子类型SupplierMapper对象,子类型对象//已被spring实例化于容器中baseField.set(this, field.get(this));//把basedao的引用,设置到去引用supplierdao指向的堆内存//后面basedao实际上指向的是SupplierMapper的代理对象在堆内存的实际存在System.out.println("baseField对应的对象-->"+baseField.get(this));//org.apache.ibatis.binding.MapperProxy@367970fa}@Overridepublic T selectById(int pk) throws Exception {// TODO Auto-generated method stubreturn basedao.selectById(pk);}@Overridepublic int deleteById(T entity) throws Exception {// TODO Auto-generated method stubreturn basedao.deleteById(entity);}@Overridepublic int deleteByIds(int[] ids) throws Exception {// TODO Auto-generated method stubreturn basedao.deleteByIds(ids);}@Overridepublic int insert(T entity) throws Exception {// TODO Auto-generated method stubreturn basedao.insert(entity);}@Overridepublic int update(T entity) throws Exception {// TODO Auto-generated method stubreturn basedao.update(entity);}@Overridepublic Page<T> selectPage(Page<T> page) {// TODO Auto-generated method stubpage.setList(basedao.selectPageList(page));page.setTotalRecords(basedao.selectPageCount(page));return page;}@Overridepublic Page<T> selectPageMulti(Page<T> page) {// TODO Auto-generated method stubpage.setList(basedao.selectPageListMulti(page));page.setTotalRecords(basedao.selectPageCountMulti(page));return page;}}


0 0
原创粉丝点击