通过aop转发方法

为了让mongodbRepository的方法和自己实现的方法,使用同一个类调用。
注解:
标记自定义方法

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Documented
@QueryAnnotation
public @interface SelfMongoMethod {

}

标记实现类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MongoImpl {
    /**
     * 实现类
     * @return
     */
    Class<?> value() default Object.class;



}
@Repository
public interface UserRepository extends MongoRepository<User, String>,UserExpandRepository  {

    /**
     * 根据邮箱查询用户和权限
     *
     * @param email
     * @return
     */
    Optional<User> findFirstByEmail(String email);

    /**
     * 根据登陆名查询用户和权限
     *
     * @param login
     * @return
     */
    Optional<User> findFirstByLogin(String login);

    /**
     * 根据登陆名查询
     * @param login
     * @return
     */
    @Query(value = "{login::login}",fields = "{roles:0,appIds:0}")
    Optional<User> findOneByLogin(@Param("login") String login);

    /**
     * 根据邮箱查询
     *
     * @param email
     * @return
     */
    @Query(value = "{email::email}",fields = "{roles:0,appIds:0}")
    Optional<User> findOneByEmail(@Param("email")String email);
}
@MongoImpl(UserRepositoryImpl.class)
public interface UserExpandRepository{
    /**
     //     * @Query("{}")
     //     * 略过mongodb方法名称校验
     //     *
     //     * @param username
     //     * @param age
     //     * @return
     //     */
    @SelfMongoMethod
    List<User> findMy(@Param("username")String username, @Param("age")int age);

}

@Service
public class UserRepositoryImpl implements UserExpandRepository{

    @Autowired
    private MongoTemplate mongoTemplate;
//
    @Override
    public List<User> findMy(@Param("username")String username, @Param("age")int age){
        return mongoTemplate.findAll(User.class);
    }





}
@Aspect
@Component
public class MongoImplAop {
    private static final Logger logger = LoggerFactory.getLogger(MongoImplAop.class);


    @Autowired
    private SpringContextsUtil springContextsUtil;


    /**
     * 定义一个切点
     */
    @Pointcut(value = "@annotation(com.iflytek.cloudbaseserver.repository.SelfMongoMethod)")
    public void annotationPointCut() {
    }

    //声明一个advice,并使用@pointCut定义的切点
    @Around("annotationPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        MongoImpl clazz = AnnotationUtils.findAnnotation(((MethodSignature) point.getSignature()).getMethod().getDeclaringClass(), MongoImpl.class);
        String impClassName = clazz.value().toString();

        //获取注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();

        //目标类、方法
        String className = method.getDeclaringClass().getName();
        String name = method.getName();
        method.getParameterAnnotations();

        SelfMongoMethod mongoJs = method.getAnnotation(SelfMongoMethod.class);
        System.out.println(method.getName());
        Method implMethod = ReflectionUtils.findMethod(clazz.value(), method.getName(), method.getParameterTypes());
        implMethod.setAccessible(true);
        return ReflectionUtils.invokeMethod(implMethod, springContextsUtil.getBean(clazz.value()), point.getArgs());
    }
}

调用

@Autowired
    private UserRepository userRepository;

   

    @Test
    public void test(){
      List<User> userList =  userRepository.findMy("admin",20);
        System.out.println(GsonUtil.toJson(userList));
    }
发表新评论