代码改变世界

spring注解标签使用

2018-07-13 14:13  关四刚  阅读(691)  评论(0)    收藏  举报

1、@Component、@Repository、@Service、@Controller

@Repository、@Service、@Controller这三个和@Component的是等效的,

但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。

 

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

 

2、@component-scan

@component-scan标签默认情况下自动扫描指定路径下的包(含所有子包),将带有@Component、@Repository、@Service、@Controller标签的类自动注册到spring容器。对标记了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的类进行对应的操作使注解生效(包含了annotation-config标签的作用)。

 

3、@Autowired与@Resource

@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

Java代码
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;

@Resource(这个注解属于J2EE的),默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


Java代码
@Resource(name="baseDao")
private BaseDao baseDao;
@Resource(name="baseDao") private BaseDao baseDao;
推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。
4、
@Aspect
https://blog.csdn.net/qgfjeahn/article/details/60144241
Spring只支持XML方式而没有实现注解的方式(也叫AspectJ方式)的AOP,所以要使用@Aspect注解,只能引入AspectJ相关的 jar 包 aopalliance-1.0.jar 和 aspectjweaver.jar。

5、target

前言


目前,越来越多的架构设计在使用注解,例如spring3.0、struts2等框架。让我们先来看看注解的定义。如下是一段使用了JDK 5 Annotation @Target的代码:


1
2
3
4
5
6
7
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AsynLog {
   
 }

一、@Target的用法

java.lang.annotation.Target

用于设定注解使用范围

java.lang.annotation.ElementType

Target通过ElementType来指定注解可使用范围的枚举集合

二、ElementType的用法

取值 注解使用范围
METHOD 可用于方法上
TYPE 可用于类或者接口上
ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型)
CONSTRUCTOR 可用于构造方法上
FIELD 可用于域上
LOCAL_VARIABLE 可用于局部变量上
PACKAGE 用于记录java文件的package信息
PARAMETER 可用于参数上

这里重点说明下:ElementType. PACKAGE。它并不是使用在一般的类中,而是用在固定的文件package-info.java中。这里需要强调命名一定是“package-info”。由于package-info.java并不是一个合法的类,使用eclipse创建类的方式会提示不合法,所以需要以创建文件的方式来创建package-info.java。


例如,定义可使用范围PACKAGE:


1
2
3
4
5
6
7
@Target({ElementType.PACKAGE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AsynLog {
   
}

 那么,创建文件:package-info.java,内容如下:


1
2
@AsynLog
package org.my.commons.logs.annotation;

6、@Retention

日常开发中经常用到注解,所以也会经常使用到@Retention注解,写下这篇文章做个记。 
Reteniton的作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}
    • SOURCE 
      被编译器忽略

    • CLASS 
      注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略。

    • RUNTIME 
      保留至运行时。所以我们可以通过反射去获取注解信息。