如何理解泛型?
参数化类型,是JDK1.5的新特性。(定义泛型时使用参数可以简单理解为形参)
编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效。
为何使用泛型?
提高编程时灵活性。
提高程序运行时的性能。(在编译阶段解决一些运行时需要关注的问题,例如强转)
泛型的应用类型?
泛型类: class 类名<泛型>{}
泛型接口: interface 接口名<泛型>{}
泛型方法: 访问修饰符 <泛型> 方法返回值类型 方法名(形参){}
泛型的通配符?(这里的通配符可以看成是一种不确定的类型)
泛型应用时有一个特殊符号”?”,可以代表一种任意参数类型,注释是实参。
通配符泛型只能应用于变量的定义。
泛型的上下界问题?
指定泛型下界:<? super 类型>
指定泛型上界:<? extends 类型>
例如:
List<? extends CharSequence> list1=new ArrayList
List<? super Integer> list2=new ArrayList
说明:这种上下界一般会用于方法参数变量定义,方法返回值类型定义。
- 泛型类型擦除?
泛型是编译时的一种类型,在运行时无效,运行时候都会变成Object类型。
序列化基础加强
何为序列化&反序列化?
序列化:将对象转换为字节的过程。
反序列化:将字节转换为对象的过程。
序列化的应用场景?
网络通讯
数据存储(例如文件,缓存)
Java 中的对象的序列化与反序列化?
对象要实现Serializable接口
添加序列化id(为反序列化提供保障)
借助流对象实现序列化和反序列化?
- Java 中的序列化存在安全问题如何解决?
- 添加writeObject(ObjectOutpuStream out)方法
对内容进行加密再执行序列化。
- 添加readObject(ObjectInputStream in)方法对
内容先进行反序列化然后在执行解密操作
- Java 中序列化的粒度如何控制?
Transient (当少量属性不需要序列化时,使用此关键字修饰)
Externalizable(当只有少量属性需要序列化时实现此接口然后自己进行序列化操作,但是要序列化的对象必须时public修饰。)
- Java 中序列化的性能问题?
注解应用基础加强
如何理解注解(Annotation)?
JDK1.5推出的一种新的应用类型(特殊的class)
元数据(Meta Data):一种描述性类型,例如@Override
注解(Annotation)应用场景?
描述类及其成员(属性,方法):例如@Overide
替换项目中xml方式对相关对象的描述(例如@Service,@Controller,…)
例如spring框架中相关注解?
1)@Configuration (描述配置类对象)
2)@Service(描述业务层对象)
3)@Controller(描述控制层对象)
4)@Responsitory(描述数据层对象)
5)@RestController(描述控制层对象)
6)@RestControllerAdvice(描述控制全局异常处理)
7)@Bean(描述bean对象,一般修饰方法将返回交给spring管理)
8)@Autowired(实现bean对象的自动装配)
9)…
- 注解(Annotation)的定义?
可以借助@interface关键字进行定义,例如Override注解的应用
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override{}
其中:
1)@Target 用于描述定义的注解能够修饰的对象。
2)@Retention 用于描述定义的注解何时有效。
注解常用的生效范围?
编译时有效(例如@Retention(RetentionPolicy.SOURCE))
运行时有效(例如@Retention(RetentionPolicy.RUNTIME)
说明:我们自己定义的注解,包括框架中的很多注解基本都是运行时有效。
注解应用案例分析实现?
与编译器结合实用(@Override)
与反射API结合使用(@RequiredLog,@Transaction,…)
例如:
通过反射或类上的注解
通过反射获取属性或方法上的注解。
反射应用基础加强
如何理解反射?
Java中特有一种技术
JAVA中自省特性的一种实现?(对象运行时动态发现对象成员)
是实现JAVA动态编程的基石?(例如AOP,…)
反射的应用场景?
框架中对象的构建?(例如mybatis中的resultType,resultMap,spring中的bean)
框架中方法的调用?(例如对象set方法,get方法,spring mvc 控制层方法,..)
总之:反射不能预知未来,但可驾驭未来,通过反射可以更好构建一些编程框架,以实现通用性编程,从而达到简化代码编写。
- 反射的应用起点?
起点可以理解为反射应用的入口,在java中这个入口是字节码对象(Class对象)。其获取方式如下:
类名.class
Class.forName(“包名.类名”);最常用
实例对象.getClass();(获取已经存在的类对象)
说明:任意的一个类在同一个JVM内部,类对象是唯一的,此类对象会在第一次类加载时创建。
反射核心API?
Constructor (构造方法对象类型)
Field (属性对象类型)
Method (方法对象类型)
Annotation(注解对象类型)
…
反射应用案例分析及实现?
基于反射构建类的实例:首先要基于类对象获取构造方法对象
基于反射获取对象属性,并为属性赋值。
基于反射获取对象方法,并执行对象方法。
基于反射获取描述对象的注解,并基于注解的含义执行下一步操作。
基于反射获取类上的泛型参数?(作业)
设计模式加强
创建型模式
- 简单工厂模式
如何理解简单工厂模式?
通过静态方法(相对比较多)或实例方法创建对象
封装对象创建过程(基于条件的不同创建不同的具体产品)
简单工厂应用场景分析?
JDBC(DriverManager.getConnection(…..))
Druid(getConnection())
Mybatis(Configuration,…)
Spring(BeanFactory)
简单工厂中的对象角色?
抽象产品对象(例如SqlSession,Executor,…)
具体产品对象 (例如DefaultSqlSession,SimpleExecutor,…)
具体工厂对象(例如DefaultSqlSessionFactory,Configuration,…)

简单工厂应用分析?
优势:解耦,简单
劣势:可扩展性相对较差(创建产品的对象的工厂方法不够灵活)
- 工厂方法模式?
如何理解工厂方法模式?
创建型模式(负责创建对象)
工厂模式(平时所说的工厂模式就是工厂方法模式)
此模式的特点是基于抽象工厂扩展具体工厂然后创建产品对象。
- 工厂方法模式的应用场景分析?
Mybatis (SqlSessionFactoryBean)
Shiro (ShiroFilterFactoryBean)
Spring(DataSourceFactory,TransactionFactory)
…
- 工厂方法模式角色分析?
抽象产品(Product)
具体产品(ConcreteProduct)
抽象工厂(Factory)
具体工厂(ConcreteFactory)

例如:
mybatis中创建SqlSession对象
SqlSession(抽象产品)
DefaultSqlSession(具体产品)
SqlSessionFactory(抽象工厂)
DefaultSqlSessionFactory(具体工厂)
Spring整合mybatis时,SqlSessionFactory对象过程分析。
SqlSessionFactory (抽象产品)
DefaultSqlSessionFactory(具体产品)
FactoryBean(抽象工厂)
SqlSessionFactoryBean(具体工厂)
- 工厂方法模式应用分析?
优势: 相对于简单工厂更加灵活,更加适合创建具备等级结构(继承关系)的产品。
劣势: 假如每个抽象产品都对应一个具体工厂,那么工厂类可能会比较多。
- 抽象工厂(最难,最复杂)
- 如何理解抽象工厂?
工厂方法模式用于创建具备一定等级结构的产品。
抽象工厂是多个工厂方法的综合应用,因为它要同时创建多个具备一定等级结构的产品,我们可以将这些产品理解产品族。
抽象工厂的应用场景?(产品族—>多个抽象产品)
Spring(ClientHttpRequestFactory):了解消息头,消息体对象创建
…
- 抽象工厂对象角色分析?
抽象产品(Product)
具体产品(ConcreteProduct)
抽象工厂(Factory)
具体工厂(ConcreteFactory)

例如:ClientHttpRequestFactory 抽象工厂的应用
抽象工厂 (ClientHttpRequestFactory)
具体工厂 (SimpleClientHttpRequestFactory)
抽象产品 (ClientHttpRequest,HttpHeaders,…)
具体产品 (SimpleStreamingClientHttpRequest,…)
抽象工厂应用分析?
优势:工厂方法模式可能会产生很多个工厂类,基于此劣势借助抽象工厂创建产品族对象,可以减少工厂类对象的个数,从而更好节省资源。
劣势:一旦有新的产品族的诞生,这个抽象工厂扩展起来就会比较复杂。
- 建造模式(Builder)
- 如何理解建造模式?
建造模式又称之为构建模式,通常用于构建相对比较复杂对象,例如。
构建过程复杂。(除了复杂很多过程又重复比较多)
对象依赖关系复杂。
- 建造模式应用场景分析?
Mybatis(XmlConfigBuilder,XmlStatementBuilder)
Spring(XmlBeanDefinitionReader)
…
- 建造模式对象角色分析?
抽象建造对象角色(Builder):可能是接口,也可能是抽象类,此角色也可以省略。
具体建造对象角色(ConcreteBuilder)
导演角色(Director): 持有建造者对象,可以省略
抽象产品角色(Product) 抽象产品角色,可以省略
具体产品角色(ConcreteProduct) 具体产品角色

建造模式应用分析?
优势:解耦对象的应用以及对象创建,通过建造者创建复杂产品对象,尤其是基于配置文件创建对象的场景。
劣势:要构建的对象结构假如频繁变化可能导致构建者对象的设计比较复杂。
- 单例模式(Singleton)
- 如何理解单例模式?
保证一个类的实例在”特定范围”只有一份(例如一个JVM内部,一个线程内部),并且提供一个全局访问点可以访问到这份实例。
单例模式的应用场景?
Spring(Singleton作用域的Bean对象)
MyBatis(ErrorContext对象是每个线程一份此类实例)
…
单例模式对象角色构成
具体产品对象(例如Singleton)

4) 单例模式应用分析
a)优势:科学使用资源,避免频繁创建,销毁对象时造成的资源浪费。
b)劣势:设计不够严谨会存在线程安全问题,可扩展性相对较差。
