# spring-custom-annotation **Repository Path**: net_yc60/spring-custom-annotation ## Basic Information - **Project Name**: spring-custom-annotation - **Description**: 这是一个spring用来处理自定义类注解的小型代码 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-custom-annotation #### 介绍 1. 这是一个spring用来处理自定义类注解的小型代码 2. 这里说的不是springAop,是类的注解@Target({ ElementType.TYPE }),aop是不能处理到类注解的 3. 注意:使用自定义注解的类,是不需要添加spring组件注解的。 4. 如果添加的话,类就会被spring初始化了,当你需要使用自定义初始化方法的时候就会出错,因为一个类不能同时存在两个初始化方法 5. 本项目除了依赖spring,其他项目都不依赖 #### 安装教程 1. 下载本项目 2. 执行install.bat #### 使用说明 1. 在需要使用的项目中增加本项目依赖 ``` com.lang spring-custom-annotation 1.0.0-SNAPSHOT ``` 2. 需要使得spring扫描到com.lang包 ``` springmvc 在applicationContext.xml 在原来项目的基础上添加com.lang进入扫描 ``` ``` springBoot 在启动类中 @SpringBootApplication(scanBasePackages = {"xxx","com.lang"}) 在原来项目的基础上添加com.lang进入扫描 ``` 3.实现 CustomAnnotationScannerService 接口 ``` 接口中共需要实现三个方法: /** * 设置扫描的注解 */ Class type(); /** * 设置扫描的包 */ String[] scannerPackage(); /** * 处理扫描 * @param t 扫描到的注解对象,可以通过t对象获取注解的属性内容 * @param markClass 被注解到的类 * @param beanDefinitionRegistry spring类注册对象 * 例子: * GenericBeanDefinition beanDef = new GenericBeanDefinition(); * beanDef.setBeanClass(xxx.class); //设置你需要实例化的类对象 * Map map = Maps.newHashMap(); //map用于设置类的属性 * beanDef.setPropertyValues(initBeanValues(map)); * beanDefinitionRegistry.registerBeanDefinition(beanName,beanDef); */ void doScan(T t, Class markClass,BeanDefinitionRegistry beanDefinitionRegistry); ``` 4.实例 以注解 @RabbitMqService 为例(每一个类注解就要单独实现一个CustomAnnotationScannerService 接口) ``` @Component //需要声明为spring的一个组件进行处理 public class RabbitMqServiceAop implements CustomAnnotationScannerService { @Override public Class type() { return RabbitMqService.class; //通过这个方法声明要扫描的注解 } @Override public String[] scannerPackage() { return new String[]{"<使用了这个注解的类所在的包>"}; //这是用来设置扫描的包的 } //这个方法是扫描到这些使用了该自定义注解的类,之后你要搞什么,我这边是通过这个扫描手动加入几个特殊的bean * @param t 扫描到的注解对象,可以通过t对象获取注解的属性内容 * @param markClass 被注解到的类 * @param beanDefinitionRegistry spring类注册对象 @Override public void doScan(RabbitMqService rabbitMqService,Class markClass, BeanDefinitionRegistry beanDefinitionRegistry) { GenericBeanDefinition beanDef = new GenericBeanDefinition(); beanDef.setBeanClass(RabbitInvokerProxyFactoryBean.class); beanDef.setPropertyValues(initBeanValues(map)); String simpleName = markClass.getSimpleName(); String beanName = simpleName.substring(0,1).toLowerCase() + simpleName.substring(1) + "client"; beanDefinitionRegistry.registerBeanDefinition(beanName,beanDef); } } ``` ##### 2020-08-11 新增 @MethodAop 常用注解工具类 使用方法: 1. 添加依赖和扫描com.lang 步骤同上 2. 具体代码: