container injection
J2EE中容器充當中間件的角色。主要的容器包括:
WEB容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,不必關註其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵守J2EE規範中的WEB APPLICATION 標準。我們把遵守以上標準的WEB服務器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行業領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規範的EJB放入該容器,馬上就會被容器進行高效率的管理。並且可以通過現成的接口來獲得系統級別的服務。例如郵件服務、事務管理。WEB容器和EJB容器在原理上是大體相同的,更多的區別是被隔離的外界環境。WEB容器更多的是跟基於HTTP的請求打交道。而EJB容器不是。它是更多的跟數據庫、其它服務打交道。但他們都是把與外界的交互實現從而減輕應用程序的負擔。例如SERVLET不用關心HTTP的細節,直接引用環境變量session,request,response就行、EJB不用關心數據庫連接速度、各種事務控制,直接由容器來完成。
註解
註解就是符合一定格式的語法 @xxxx,是給jvm看的,給機器看的。註解在目前而言最主流的應用是代替配置文件。
關於配置文件與註解開發的優缺點:
- 優點:開發效率高,成本低
- 缺點:耦合性大,並且不利於後期維護
jdk5提供的註解
@Override:告知編譯器此方法是覆蓋父類的
@Deprecated:標註過時
@SuppressWarnings:壓制警告
不同的註解只能在不同的位置使用(方法上、字段上、類上)
自定義註解
怎樣去編寫一個自定義的註解,使用@interface關鍵字。
public @interface MyAnno { //註解的屬性 String name(); int age() default 28; }
怎樣去使用註解
@MyAnno(name="",age=20) public void show(){ } @MyAnno(name="") public void show1(){ }
註意:如果屬性的名字是value,並且註解的屬性值只有一個,那麽在使用註解時可以省略value。註解屬性類型只能是以下幾種:基本類型;String;枚舉類型;註解類型;Class類型 ;以上類型的一維數組類型。
public @interface MyAnno2 { //String value();
String[]value(); }
//@MyAnno2("aa") //public void show2(){ //} @MyAnno3({"name","age"}) public void show3(){ }
怎樣去解析註解-----使用反射知識
介入一個概念,元註解。代表修飾註解的註解,作用是限制定義的註解的特性。
@Retention
- SOURCE: 註解在源碼級別可見,在字節碼文件中就沒有了。
- CLASS:註解在字節碼文件級別可見
- RUNTIME:註解在整個運行階段都可見
@Target 代表註解修飾的範圍:類上使用,方法上使用,字段上使用
- FIELD:字段上可用此註解
- METHOD:方法上可以用此註解
- TYPE:類/接口上可以使用此註解
import java.lang.reflect.Method; /** * Created by Administrator on 2017/7/28. */ public class MyAnnoParse { public static void main(String[]args) throws NoSuchMethodException { //解析show方法上面的@MyAnno //直接的目的是 獲得show方法上的@MyAnno中的參數 //獲得show方法的字節碼對象 Class clazz = MyAnnoTest.class; Method method = clazz.getMethod("show", String.class); //獲得show方法上的@MyAnno MyAnno annotation = method.getAnnotation(MyAnno.class); //獲得@MyAnno上的屬性值 System.out.println(annotation.name());//zhangsan System.out.println(annotation.age());//28 //根據業務需求寫邏輯代碼 } }
註意:要想解析使用了註解的類 ,那麽該註解的Retention必須設置成Runtime,註解解析的實質是從註解中解析出屬性值
字節碼對象存在於獲得註解相關的方法
isAnnotationPresent(Class<? extends Annotation> annotationClass) : 判斷該字節碼對象身上是否使用該註解了 getAnnotation(Class<A> annotationClass) :獲得該字節碼對象身上的註解對象
container injection