1. 程式人生 > >container injection

container injection

沒有 jdk static 編寫 jsp 業務 code target 缺點

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