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) :获得该字节码对象身上的注解对象
posted @ 2019-03-24 11:34  dpqqq  阅读(120)  评论(0)    收藏  举报