一、java内置注解
1、@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ' v: g% p3 T6 b' } C! r" _$ W
ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例) : ?) c1 _! ~ E* l8 v
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明 7 r' Z9 G9 k- l4 O/ U6 w
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明# S2 W: I( Q# R8 U" V9 q# D3 |
2、@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃 : j- u- ]. o( V) `6 u# z/ o
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 , X1 ~0 }+ L5 G1 K) O/ k
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。# N' y, v. _# Z, H W8 |7 D
* p R4 j: {& A' y. o0 Z
3、@Documented 将此注解包含在 javadoc 中
4、@Inherited 允许子类继承父类中的注解
5、@Deprecated 表示当前元素是不赞成使用的。
+ n5 s1 U8 j2 ^7 ~ R7 r
6、@Override 表示当前方法是覆盖父类的方法。
2 r! y: H9 k- n5 b# N0 C
7、@SuppressWarnings 表示关闭一些不当的编译器警告信息。; ?( X( f+ L. [! q7 e" x
+ Q8 z! K* y3 Y2 w) ^
二、Spring内置注解
1、@Autowired注解9 x* I) A4 k8 j) _
采用byType的方法自动装配。可以应用在类的成员变量、成员方法和构造子。默认情况下使用@Autowired注解进行自动注入时,Spring容器 中匹配的候选Bean数目必须有且仅有一个。可以设置required=false让其成为可选的。当存在多个类型一致的bean时,可以用 @Qualifier注解来明确指定要装配的bean。) F6 [1 z6 r8 N3 _+ e3 q
7 N4 O' D; Z6 d g2 Z4 U# M" }) ` x
2、@Qualifier注解
@Qualifier("Bean的名称") 指定注入Bean的名称。只能用于类的成员变量、方法的参数和构造子的参数。如果它与@Autowired联合使用,则自动装配的策略就变为byName了。3 _9 j, o, i' @6 ^/ E6 L
8 o9 N" S# W& T3 B" Y; }+ ~
注解使用范例:
1. public class Person { 2. private Long id; 3. private String name; 4. private Address address; 5. 6. public Person(){ 7. 8. } 9. 10. public Person(Long id, String name){ 11. this.id = id; 12. this.name = name; 13. } 14. 15. @Autowired(required=false) 16. public void setAddress(@Qualifier("address2")Address address) { 17. this.address = address; 18. } 19. }
1. <!-- 通过注解定义bean。默认同时也通过注解自动注入 --> 2. <context:component-scan base-package="com.cjm"/> 3. 4. <bean id="address1" class="model.Address" p:city="gz1" p:zipCode="111"/> 5. <bean id="address2" class="model.Address" p:city="gz2" p:zipCode="222"/> 6. 7. <bean id="person" class="model.Person"> 8. <constructor-arg index="0" value="111"/> 9. <constructor-arg index="1" value="cjm"/> 10. </bean>
1. @Target({ElementType.FIELD, ElementType.PARAMETER}) 2. @Retention(RetentionPolicy.RUNTIME) 3. @Qualifier 4. public @interface MyQulifier { 5. String value(); 6. }
1. public class Person { 2. private Long id; 3. private String name; 4. private Address address; 5. 6. public Person(){ 7. 8. } 9. 10. public Person(Long id, String name){ 11. this.id = id; 12. this.name = name; 13. } 14. 15. @Autowired 16. public void setAddress(@MyQulifier("a2")Address address) { 17. this.address = address; 18. } 19. }
1. <bean id="address1" class="model.Address" p:city="gz1" p:zipCode="111"> 2. <qualifier type="annotation.MyQulifier" value="a1"/> 3. </bean> 4. 5. <bean id="address2" class="model.Address" p:city="gz2" p:zipCode="222"> 6. <qualifier type="annotation.MyQulifier" value="a2"/> 7. </bean>
3、@Component注解7 g3 C; Y0 T3 m2 ~
3 K- w0 v) F0 `2 N, C
@Component("Bean的名称") 通过注解标注一个类为受管Bean。默认情况下通过@Component定义的Bean都是singleton的,如果需要使用其它作用范围的Bean,可以通过@Scope注释来达到目标。4 r8 U: ]6 s0 r) E, {# K/ X
% p w8 ~0 u( u5 N0 X/ E
1 O l5 o! K% z/ Z/ ]1 p/ g6 y
" H% c6 @! e* X. V) X
4、@Scope注解2 Q c; J8 B- k' s9 {" ]2 |
@Scope("Bean的作用范围") 通过@Scope注解为受管指定作用域。BeanBean的作用范围有:singleton、prototype等。
0 z, r& F3 j, g
5、@Controller注解
& c; {! R. K& x) E
6、@Service注解# N) R5 S$ O3 c1 D( x+ p5 U1 I. l
* a K- O: O! P+ `0 b1 }
? `) q5 W. p \/ I7 X
; A! G, e5 m% `5 b4 O1 i5 s
7、@Repository注解
, s' v( ]9 f. a
三、JSR-250规范的注解(需要common-annotations.jar包的支持)
1、@Resource注解2 U# E, B9 c# L! H- n$ Y4 Q: l
@Resource(name="person") name属性用于指定注入的Bean的名称。2 }. F/ _, h' y; M. ~
@Resource(type=Person.class) type属性用于指定注入的Bean的类型。8 d0 y1 H. U1 t4 W; m
5 `5 r- B8 \3 f
2、@PostContsuct注解
! i5 p8 G9 d2 f; q6 Z6 c7 z
用于指定受管Bean的初始化方法,作用与Bean的init-method属性类似。7 s1 M" w9 U- D' W$ f
2 a3 ^1 U3 E9 W
]1 A$ X9 l( @0 D
, x( G) Y, R9 V' b' O; J
3、@PreDestory注解
, I! w5 v& W+ K$ \5 Q6 p
用于指定受管Bean的析构方法,作用与Bean的destory-method属性类似。8 T, @& {/ H. ]. k+ a6 h$ J
2 G% I3 q. G- i6 Z+ x
四、AspectJ内置注解