黑马程序员——java高新技术(下)
高新技术
AOP
AOP(Aspect Oriented program,简称AOP)即为面向方面的编程
·系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:
{安全、事务、日志等功能要贯穿到好多个模块中,所以,它们就是交叉业务。}
安全 事务 日志
StudentService--|------|------|------
CourseService---|------|------|------
MiscService-----|------|------|------
·用具体的程序代码描述交叉业务员:
method1 method2 method3
{ { {
-----------------------------------------切面
... ... ...
-----------------------------------------切面
} } }
·交叉业务的编程问题即为面向方面的编程(Aspect Oriented program,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,如下所示:
-----------------------------------------切面
func1 func2 func3
{ { {
... ... ...
} } }
-----------------------------------------切面
·使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。
JavaBean
是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名称符合某种命名规则。
·如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存在哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
-setId()的属性名->id
-isLast()的属性名->last
-setCPU的属性名是什么?->CPU
-getUPS的属性名是什么?->UPS
总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
·一个符合JavaBean特点的类可以当做普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
-在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选 的余地!
-JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。
操作技巧:重构抽取方法eclipse快捷键alt+shift+M
注释(采用@前缀):
位置可以在包、类、字段、方法、方法的参数以及局部变量上
@Deprecated表示不鼓励程序员使用这样的元素,通常是因为它过时或存在更好的选择。运行阶段有用。
@Override表示一个方法声明打算重写超类中的另一个方法声明。源程序阶段有用。
@SuppressWarnings指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。源程序阶段有用。
定义一个最简单的注解:public @interface MyAnnotation{}
信息的信息就是元信息;注解的注解就是元注解;
@Retention指示注释类型的注释要保留多久。其有三种取值:RetioonPolicy.SOURCE RetionPolicy.CLASS RetionPolicy.RUNTIME
@Target指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
为注解增加高级属性:@MyAnnotation(arrayAttr={1、2、3});
@MyAnnotation(lamp = EnumTest.TrafficLamp.GREEN);
@MyAnnotation(annotationArr=@MetaAnnotation(“yyy”));