Java 春季定制注解
我很少看到使用自定义注释的示例。范例Java 春季定制注解,java,spring,Java,Spring,我很少看到使用自定义注释的示例。范例 @SimpleAnnotation class SampleBean { @SimpleAnnotation public String getName() { return "AAA"; } public void setName(String name) { } public int getHeight() { return 201; } } @Target( { ElementType.METHOD,
@SimpleAnnotation
class SampleBean {
@SimpleAnnotation
public String getName() {
return "AAA";
}
public void setName(String name) {
}
public int getHeight() {
return 201;
}
}
@Target( { ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface SimpleAnnotation {
}
有人能告诉我们为什么要使用它吗?使用自定义注释的最佳部分是,您不必进行任何配置,Spring将自动检测这些bean是服务组件,一切都会正常工作。自定义注释是Spring中添加的一个非常小的功能,但非常有用 两个选项:
- 您需要自定义批注上的
@组件
批注。这样,您就可以使用自定义注释将类标记为bean。此外,还可以添加默认范围和其他元信息
- 限定符-您可以使用限定符注释(用
元注释注释)来区分相同接口的实现@qualifier
@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public @interface ReadOnlyService {}
然后你可以简单地写:
@ReadOnlyService
public class RoleService {
}
Spring将找到@ReadOnlyService
,并在语义上将其替换为:
@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public class RoleService {
}
当然,如果您有大量的服务使用相同的Spring注释集进行注释,而这些注释集可以替换为一个命名良好的注释,那么使用自定义注释是值得的
示例取自:Spring支持许多注释“元注释”的概念。(我不确定这是否是为了所有人。) 这意味着您可以构建自己的注释,并使用其中一个Spring“核心”注释对注释进行注释 例如:
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Service
public @interface MyService {
}
然后您可以使用此注释而不是@Service
。(顺便说一句:@服务
,@存储库
,@控制器
使用相同的技术从@组件
中“继承”)
大量使用此功能的一个示例是从
@Qualifier
中“继承”。
有关示例和一些解释,请看一看(本章末尾是带有@Genre
的示例。)
使用该技术可以实现的一个非常有用的构造是,它使您能够将多个注释组合成(在您的用例中)更具意义的注释。因此,不要在某些类型的每个类上都编写相同的两个注释,例如:@Service
和@Qualifiyer(“someting”)
(org.springframework.beans.factory.annotation.Qualifier)。您可以创建使用这两个注释进行注释的自定义注释,然后在bean中仅使用这一个自定义注释。(@See)
如果您想了解这项技术的使用能力,可以看看上下文和依赖项注入框架
评论中的问题: @interface中还定义了一些变量,这意味着什么 注释(由@Interface定义)的工作方式有点像bean。这些字段是使用注释时可以/必须定义的属性。以后可以通过反射API读取这些值 例如,Spring中的
@Controller
注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
名为
value
的字段是可以在没有明确名称的情况下使用的字段:(@Controller(“myUrl”)
是相同的@Controller(value=“myUrl”)
)一种常见模式也是在AOP切入点中使用注释。不是专门针对Spring的,但在使用Spring AOP时经常使用。自定义注释本身不起任何作用。它们是代码中的简单标记。它们真正的力量来自于寻找特定注释的工具。和其他一些答案一样,Spring有多种注释用途,现在有了定义自己组件类型的机制。相当整洁。另一个例子是,几周前,我使用AOP和一些自定义注释来提供简单的方法级结果缓存。现在我已经准备好了缓存引擎,并定义了相应的AOP钩子,如果我想缓存一个方法,我只需添加该注释。有些人只是将注释作为花哨的元数据来提高可读性
归根结底,它们是一个相当简单的工具,可以用于很多事情。Tomasz:我看到了一些例子,它还使用@ReadOnlyService公共类RoleService{string var;}在您所解释的示例中,这意味着什么?这意味着您可以用一个注释代替这三个注释,而不是反复使用这三个注释。Ralph:interface中还定义了一些变量,这意味着什么?@Junaidaj:See我的扩展答案