文章目录
一、Java基础
1.注解
1.1概念
他提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序进行关联。直观明了的说,注解就是信息与程序的业务逻辑无关,并且供指定的工具或框架使用。
Java注解是附加在代码中的一些元信息,便于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 它不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,包含在java.lang.annotation包中。
1.2内置注解
常用注解列举
@Override:提示子类要复写父类中被它修饰的方法;
@Suppress Warnnings:组织警告;
@FunctionalInterface:函数式接口注解(Java1.8版本引入),是一个具有一个方法的普通接口
1.3元注解
基础知识再现:
@Retention:定义生命周期
RetentionPolicy.SOURCE
:在编译阶段丢弃。
RetentionPolicy.CLASS
:在类加载时丢弃。
RetentionPolicy.RUNTIME
:始终不丢弃,最常用。
@Target:(类、方法、局部变量或成员变量、参数等)用于什么地方
ElementType.CONSTRUCTOR
:用于描述构造器
ElementType.FIELD
:成员变量、对象、属性(包括enum实例)
ElementType.LOCAL_VARIABLE
:用于描述局部变量
ElementType.METHOD
:用于描述方法
ElementType.PACKAGE
:用于描述包
ElementType.PARAMETER
:用于描述参数
ElementType.TYPE
:用于描述类,接口(包括注解类型)或enum声明。
@Documented:注解是否包含在JavaDoc中;
@Inherited:是否允许子类继承该注解;
即:父类P有注解A,如果A用@Inherited修饰,那么子类C也继承父类的注解A)
@Repeatable:指定注解可重复使用
即:用@Repeatable修饰的注解A,用A在定义或修饰某个类的时候,A可重复出现
1.4自定义注解
1.4.1定义CustomDescription注解
注意:
- 自定义注解中,注解的成员变量义无参数的方法形式声明
- CustomDescriptions.class为注解容器
- 若注解(非容器)中有一个Value属性,则在使用注解时直接把值写入括号内,而作为容器则需要将属性定义为数组
- 操作界面如下:
1.4.2实现继承关系
建立两个类分别添加1、2个注解
Person:
package CusAnnontation;
@CustomDescription(description="基类")
@CustomDescription(description="人")
public class Person{
......
}
Student:
package CusAnnontation;
@CustomDescription("学生")
- 若注解(不是注解容器)中只有一个value的属性,则在使用注解时,可直接把值写入括号内。
- 作为注解容器,需要将属性定义为数组。
1.5注解使用场景经介绍
- 使用注解做bean的属性值校验
- 使用注解做权限控制
- 代替配置文件功能,像Spring基于注解的配置,减少了xml的配置
- 可以生成文档,像Java代码注释中的@see、@param等
2.反射
2.1反射机制
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.2理解Class类
首先明确Class也是一个类,只是它是一个描述类的类,也可以生成对象。
一般获取Class对象的主要方式如下:
- 通过类名获取
Class<类名> c = 类名.class
- 通过对象获取
Class<类名> c = objet.getClass();
- 通过全类名获取
Class<类名> c = Class.forName(全类名)
(全类名:类所在的包名+类名)
- Class类常用方法:
public static void main(String[] args) throws Exception {
// 以String.class为例
String str = new String();
Class cl = str.getClass();
//获取包名+类名 java.lang.String
cl.getName();
//只获取类名 - String
cl.getSimpleName();
//获取数组的Class对象,因为所有的Java类都继承自Object,数组也一样.所以数组本身也是个Class, 得到数组的Class自然也可以转回数组.
cl.getComponentType();
//返回构造器数组,包括超类的公有成员.
cl.getConstructors();
//返回方法数组,包括超类的公有成员.
cl.getMethods();
//返回域(属性)数组,包括超类的公有成员.
cl.getFields();
// 返回全部构造器数组,无论是public/private还是protected,不包括超类的成员.
cl.getDeclaredConstructors();
//返回全部域数组,无论是public/private还是protected,不包括超类的成员.
cl.getDeclaredFields();
//返回全部方法数组,无论是public/private还是protected,不包括超类的成员.
cl.getDeclaredMethods();
//获取类前的修饰符
cl.getModifiers();
}
2.3反射的使用
eg:
1_Reflection
method.invoke(obje,"inputParams");
二、Spring基础
1.Spring框架介绍
1.1容器与框架的概念
- (1)什么是容器?Servlet能否独立运行?
Servlet:主要功能在于交互式地浏览和生成数据,生成动态Web内容。运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。 - (2)客户端与Servlet交互过程
- (3)什么是框架?
LDAP:轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)
框架不仅要负责管理某些Bean的生命周期(容器的功能),还需要负责搭建某些基础设施(那些通用的部分)
1.2 Spring模块
- 核心容器(Core Container):由spring-core, spring-beans,spring-context,spring-context-support和spring-expression(Spring Expression Language)组成。
Spring-core和Spring-Beans是框架的基础,主要实现了控制反转(IOC)和依赖注入(DI)。(完成部分对象生命周期管理) - AOP(Aspect Oriented Programming)面向切面编程
Spring-AOP提供了一个AOP面向切面编程的实现。
Spring-aspects模块提供了与AspectJ的继承。 - 消息发送
Spring4 包含了Spring-messaging模块,对Spring集成项目Message、MessageChannel和MessageHandler进行重要的抽象,是基于消息发送应用的基础。 - 数据访问/集成: Spring-JDBc,ORM,OXM JMS和事物spring-tx模块。
-ORM:(Object Relation Mapper,ORM)
-OXM:O 代表 Object,X 代表 XML。它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。
-JMS:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 - Web:webmvc(重点),Spring-websocket和spring-webflux。
- 测试:Spring-test.
2.依赖注入DI与控制反转IOC
2.1 依赖注入
- 在面向对象程序设计中,主要关系有泛化(继承)、聚合/组合,关联和依赖关系。依赖关系比较常见,但是种依赖关系不符合软件系统设计中的高内聚低耦合原则。
- 依赖注入,就是为了在软件系统中实现解耦(或降低模块之间的耦合关系),提高组件重用率,并且为系统搭建一个灵活、可扩展的平台。
- 依赖关系实现
class A{
B b;
public void test(){
b = new B();
b.do();
}
}
class B{
public void do(){
System.out.println(“wo shi shei?”);
}
}
在test()方法中调用了B类的do()方法,也就是A依赖B,但是方法的调用,需要用到B的对象b,所以,这里就用new B()对b进行了实例化。即对象b的创建由A自己来完成。
2.2 控制反转
把控制权交出去。通过控制反转,实现依赖注入
- 有别于前面的b的创建由A来完成,这里把b的创建交给IOC容器完成,即实现了控制权的反转(本来由A自己控制的,但交个了IOC容器)。在A中用到b时,由IOC容器将B注入到A。可以利用Java反射技术实现。