Spring自定义注解扫描的实现

 目标:实现自定义spring自动扫描注解。主要为后期实现分布式服务框架自动注解提供技术支持

  技术分析:通过配置组件扫描标签使spring解析标签。

 1. JewelScanBeanDefaultParser.java

public class JewelScanBeanDefaultParser implements BeanDefinitionParser {

    private static final String RESOURCE_PATTERN = "/**/*.class";

    private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();

    public BeanDefinition parse(Element element, ParserContext parserContext) {
        String basePackage = element.getAttribute("base-package");
        if (StringUtils.hasText(basePackage)) {
            try {
                String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage)
                        + RESOURCE_PATTERN;
                Resource[] resources = resourcePatternResolver.getResources(pattern);
                MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver);
                for (Resource resource : resources) {
                    if (resource.isReadable()) {
                        MetadataReader reader = readerFactory.getMetadataReader(resource);
                        String className = reader.getClassMetadata().getClassName();
                        Class<?> clazz = Class.forName(className);
                        JewelService jewelService = clazz.getAnnotation(JewelService.class);
                        if (null != jewelService) {
                            AnnotationBeanDefinitionLoader.load(jewelService, clazz, parserContext);
                        }
                        JewelRemote jewelRemote = clazz.getAnnotation(JewelRemote.class);
                        if (null != jewelRemote) {
                            AnnotationBeanDefinitionLoader.load(jewelRemote, clazz, parserContext);
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return null;
    }

}

2. 注解接口定义

JewelRemote.java

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JewelRemote {

	public String name() default "";

	public String version() default "v_0.0.1";

	public String registry() default "registry";

}

JewelService.java

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JewelService {

	public String name() default "";

	public String version() default "v_0.0.1";

	public String registry() default "registry";
	
	
}

 

转载于:https://www.cnblogs.com/maybo/p/5600130.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security允许我们使用自定义注解来标记需要进行访问控制的方法或类。通过自定义注解,我们可以在代码中清晰地标识出哪些部分需要进行权限验证。 以下是使用自定义注解实现Spring Security的访问控制的一般步骤: 1. 创建一个自定义注解类,比如`@CustomAnnotation`,用于标记需要进行权限验证的方法或类。 ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface CustomAnnotation { String value(); } ``` 2. 在Spring Security配置类中,通过`@EnableGlobalMethodSecurity`注解启用方法级别的安全配置,并指定自定义注解扫描路径。 ```java @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { // ... } ``` 3. 创建一个切面类,用于处理自定义注解的逻辑。 ```java @Aspect @Component public class CustomAnnotationAspect { @Around("@annotation(com.example.CustomAnnotation)") public Object processCustomAnnotation(ProceedingJoinPoint joinPoint) throws Throwable { // 根据自定义逻辑进行权限验证等处理 // ... return joinPoint.proceed(); } } ``` 4. 在需要进行权限验证的方法或类上添加`@CustomAnnotation`注解。 ```java @RestController public class MyController { @CustomAnnotation("custom_permission") @GetMapping("/protected") public String protectedResource() { // ... } } ``` 通过以上步骤,我们可以使用自定义注解`@CustomAnnotation`来标记需要进行权限验证的方法或类,并在切面类中实现相应的逻辑。在访问这些被标记的方法或类时,Spring Security会自动触发切面类中的逻辑进行权限验证。 希望以上内容对你有所帮助!如果有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值