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) :获得该字节码对象身上的注解对象