Spring及注解

Spring
学习方式:掌握用法、深入理解、不断实践、反复总结、再次深入理解与实践
网站:
http://spring.io/
http://projects.spring.io/spring-framework/
简介:Spring是一个轻量级的控制反转和面向切面的容器。

Spring中的注解可以分为两大类:
1)spring的bean容器相关的注解,或者说bean工厂相关的注解;
2)springmvc相关的注解。
spring:@Required, @Autowired, @PostConstruct, @PreDestory,@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton
springmvc:@Controller, @RequestMapping, @RequestParam, @ResponseBody
Java中的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Override的作用是,提示编译器,使用了@Override注解的方法必须override父类或者java.lang.Object中的一个同名方法。
@Target, @Retention,它们就是所谓的“元注解”——就是定义注解的注解
@Target用于提示该注解使用的地方,取值有:
TYPE:类,接口,注解、FIELD:属性域、METHOD:方法、PARAMETER:参数、CONSTRUCTOR:构造函数、LOCAL_VARIABLE:局部变量、
ANNOTATION_TYPE:注解类型、PACKAGE:包、TYPE_PARAMETER:、TYPE_USE:
@Retention(保留)用于提示注解被保留多长时间,有三种取值:
RetentionPolicy.SOURCE 保留在源码级别,被编译器抛弃(@Override就是此类);
RetentionPolicy.CLASS被编译器保留在编译后的类文件级别,但是被虚拟机丢弃;
RetentionPolicy.RUNTIME保留至运行时,可以被反射读取。
@Override 只能使用在方法上,保留在源码级别,被编译器处理,然后抛弃掉。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented :表示注解是否能被 javadoc 处理并保留在文档中。
@Documented :表示该注解类型,保留至运行时,可以被反射读取。
有了元注解,那么我就可以使用它来自定义我们需要的注解。结合自定义注解和AOP或者过滤器,是一种十分强大的武器。比如可以使用注解来实现权限的细粒度的控制——
在类或者方法上使用权限注解,然后在AOP或者过滤器中进行拦截处理。下面是一个关于登录的权限的注解的实现:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoLogin {
}
表示用在方法,类,接口上,保留至运行时,可以被反射读取。
@NoLogin, 可以被用于 方法 和 类 上,注解一直保留到运行期,可以被反射读取到。

spring的bean容器相关的注解:
1)@Autowired 是我们使用得最多的注解,其实就是根据类型进行自动注入依赖(基于注解的依赖注入),可以被使用在属性域,方法,构造函数上。
2)@Qualifier 就是 autowire=byName, @Autowired注解判断多个bean类型相同时,就需要使用 @Qualifier(“xxBean”) 来指定依赖的bean的id:
@Controller
@RequestMapping("/user")
public class HelloController {
@Autowired
@Qualifier(“userService”)
private UserService userService;
3)@Resource 用于属性域和方法上。也是 byName 类型的依赖注入。使用方式:@Resource(name=“xxBean”). 不带参数的 @Resource 默认类名首字母小写。
4)JSR-330标准javax.inject.*中的注解(@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton)。
@Inject就相当于@Autowired, @Named 就相当于 @Qualifier, 另外 @Named 用在类上还有 @Component的功能。
5)@Component, @Controller, @Service, @Repository, 这几个注解不同于上面的注解,上面的注解都是将被依赖的bean注入进去,而这几个注解的作用都是生产bean,
这些注解都是注解在类上,将类注解成spring的bean工厂中的bean。@Controller, @Service, @Repository基本就是语义更加细化的@Component。
6)@PostConstruct 和 @PreDestroy 不是用于依赖注入,而是bean 的生命周期。类似于 init-method(InitializeingBean) destory-method(DisposableBean)
JSR-330 是 Java 的依赖注入标准。

spring中注解的处理基本都是通过实现接口BeanPostProcessor来进行的:
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
相关的处理类有: AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor
这些处理类,可以通过 context:annotation-config/隐式的配置进spring容器。这些都是依赖注入的处理,还有生产bean的注解(@Component, @Controller, @Service,
@Repository)的处理:<context:component-scan base-package=“net.aazj.service,net.aazj.aop” />
这些都是通过指定扫描的基包路径来进行的,将他们扫描进spring的bean容器。注意 context:component-scan 也会默认将 AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor 配置进来。所以context:annotation-config/是可以省略的。另外context:component-scan也可以扫描@Aspect风格的AOP注解,
但是需要在配置文件中加入 aop:aspectj-autoproxy/ 进行配合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章