Annotation in spring
Java从JDK1.5以后,提供了Annotation的功能
spring中的常用注解
- @Component
是一个泛化的概念,仅仅表示一个组件(Bean)
- @Repository
标识DAO
层的组件
- @Service
标识Service
层的组件
- @Controller
标识Controller
层的组件
- @Autowired
按照Bean类型
装配
- @Resource
按照Bean实例名称
装配
- @Qualifier
与@Autowired
配合使用,会将默认的按Bean类型装配修改为按照Bean实例名称装配,Bean的实例名称由@Qualifier
注解的参数指定。
Notice
@Component
是泛化的,@Repository
@Service
@Controller
是具体的,这三个注解可以用@Component
代替,但为了明确Bean的职责,一般不这么用。@Resource
注解部分源码如下
package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
String name() default "";
String lookup() default "";
Class<?> type() default java.lang.Object.class;
enum AuthenticationType {
CONTAINER,
APPLICATION
}
AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
boolean shareable() default true;
String mappedName() default "";
String description() default "";
}
属性装配规则
- 如果指定了name属性,那么按照
实例名称
进行装配 - 如果指定了type属性,那么按照
Bean类型
进行装配 - 如果都不指定,则先按照
实例名称
装配,如果不能匹配,再按照Bean类型
进行装配。如果都无法匹配,则抛出NoSuchBeanDefinitionException
异常
小结
基于xml配置文件装配,过于臃肿,给后续的维护和升级带来一定的困难,基于注解的装配解决了这个缺陷