Shiro权限注解原理(4)

private boolean isAuthzAnnotationPresent(Method method) {
        Annotation a = AnnotationUtils.findAnnotation(method, Log.class);
        return a!= null;
    }
}

实现MethodInterceptor接口,定义切面处理的逻辑
public class LogMethodInterceptor implements MethodInterceptor{

public Object invoke(MethodInvocation invocation) throws Throwable {
        Log log = invocation.getMethod().getAnnotation(Log.class);
        System.out.println("log: "+log.value());
        return invocation.proceed();   
    }
}

定义一个测试类,并添加Log注解
@Component
public class TestHello {

@Log("test log")
    public String say() {
        return "ss";
    }
}

编写启动类,并且配置DefaultAdvisorAutoProxyCreator
@Configuration
public class TestBoot {

public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.fzsyw.test"); 
        TestHello th = ctx.getBean(TestHello.class);
        System.out.println(th.say());
    }
   
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator da = new DefaultAdvisorAutoProxyCreator();
        da.setProxyTargetClass(true);
        return da;
    }
}

最终打印的结果如下,证明编程式的AOP生效。
log: test log
ss

4|0总结与思考

Shiro的注解式权限,使用确实方便,通过源码也分析了它的实现原理,比较核心的是配置DefaultAdvisorAutoProxyCreator和继承StaticMethodMatcherPointcutAdvisor。其中的5中权限注解,使用了统一一套代码架构,用到了的模板模式,方便扩展。最后自己也简单做了一个小例子,加深对编程式AOP的理解。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ca6c012f65e13e14787202e4142b4069.html