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/ 進行配合。

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