48.常见的异常类有哪些
NullPointerException:当应用程序试图访问空对象时,则抛出该异常。 (空指针异常) SQLException:提供关于数据库访问错误或其他错误信息的异常。 (数据库访问异常) IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范 围时抛出。 (越界异常)
NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转 换为适当格式时,抛出该异常。 (类型转换异常)
FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。 (路径失 效异常)
IOException:当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异 常 的通用类。 (流异常)
ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。 ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。 IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。 ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零” 时,抛 出此类的一个实例。
NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。 NoSuchMethodException:无法找到某一特定方法时,抛出该异常。
SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
UnsupportedOperationException:当不支持请求的操作时,抛出该异常。
RuntimeException:是那些可能在 Java 虚拟机正常运行期间抛出的异常的超 类。 (运行时异 常)
49.说一下你熟悉的设计模式
单例模式、工厂模式、代理模式、策略模式
1. 单例模式:就是一个应用程序中,一个类的实例对象只有一个,不能使用new创建新的实例对象, 因为被实例化的构造函数是被private修饰的,一般通过一个方法来获取类内部已经定义好的实 例。
2. 代理模式:分为静态代理和动态代理,代理模式是为了向其他对象提供一种控制本对象访问的途 径。可以看38题相关内容
3. 工厂模式:定义一个创建对象对象的接口,让其子类自己决定实例化哪一个工厂,工厂模式使其创 建过程延迟到子类进行。
4. 策略模式:定义一系列的算法,把他们一个个封装起来,并使这些算法可以在运行时根据不同需求 进行调整。
(1)简单工厂与抽象工厂有什么区别
1.简单工厂模式常用于业务比较简单,项目比较小的情况下。 由三种角色组成: 工厂类角色:具有商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。 抽象产品角色:一般时具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
2.抽象工厂模式常用于给客户端提供一个接口,可以创建多个产品族中的产品对象。需要满足系统中具 有多个产品族,而系统一次只可能消费其中一族产品;并且需要同属于一个产品族的产品一起使用。 什么是产品族:就是位于不同产品等级结构中,功能相关联的产品组成的家族。 由四中角色组成(与简单工厂模式相差无几) 抽象工厂角色:是抽象工厂模式的核心,他与应用程序无关。是具体工厂角色必须实现的接口或继承的 类。由接口或者抽象类来实现。 具体工厂角色:具有商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。 抽象产品角色:一般时具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
50.为什么要使用spring
为了解决企业应用开发的复杂性以及耦合问题,简单来说spring是一个轻量级的控制反转和面向切面的 开源J2EE容器框架。提供了许多优秀的功能:IOC、AOP、声明式事务、开源集成、简化开发。
(1)spring的优缺点
提供了IOC容器,可以将对象之间的依赖关系交给spring控制,降低了耦合性,简化了开发。
提供了AOP的功能,方便进行面向切面编程,相对于面向对象编程,它可以更轻松的实现一些功能,对 一些业务代码进行增强,减少代码重复,提高开发效率,方便维护。
提供了声明式事务的支持,将事务管理从业务方法代码中脱离出来,以声明的方式实现事务管理。 方便继承各种优秀框架,降低了各种框架的使用难度 降低了开发难度,只需要专注业务开发,不需要过分关注底层如何实现。
51.什么是IOC,有什么作用
IOC即控制反转,它把传统意义上由程序代码直接创建和操控对象的权力交给了容器,通过容器来实现 对象的装配和管理。控制反转即意味着对象控制权的转移,从代码本身转移到了外部容器。另外,ioc 是通过DI(依赖注入)进行管理对象。
作用: 管理对象的创建和依赖关系的维护 解耦,有容器代替代码,降低了耦合性 托管了类的产生过程,代理模式(代理类)
(1)IOC的实现机制 工厂模式+反射机制
(2)IOC与DI的关系 大概上来说两者是同一个东西大差不差,但是他们其实是从不同角度区描述同一件事。IOC是从容器的 角度描述,DI是从应用程序的角度去描述,IOC是一种设计思想,而DI是具体的实现方式。
52.解释一下AOP
AOP即面向切面编程,可以说是OOP的补充和完善。OOP引入封装、继承、多态等概念建立一种对象 层次结构,是一个从上到下的层次关系结构,而AOP描述一个切面之间的关系,是从左到右的一种关 系。
AOP用于将那些与业务无关,但又对多个对象产生更形象的公共行为和逻辑抽并封装为一个可重用的模 块,也就是“切面”,减少了系统中的重复代码,降低了模块间的耦合,提高了系统的可维护性。
(1)解释一下AOP中的名词
切面:指切面类,用于封装对多个对象存在影响的公共行为和逻辑,管理着切点和通知。
连接点:指的就是被增强的业务方法。
通知:就是需要增加到业务方法中的公共代码,通知又很多类型,分别可以在需要增加的业务方法不同 位置进行执行(前置、后置、异常、返回、环绕通知)
切点:由他决定那些方法需要增强,那些不需要增强,结合切点表达式实现。
目标对象:指的是增强的对象
织入:aop的织入方式为动态代理,就是目标对象创建动态代理的过程就叫做织入。
(2)AOP的通知类型有哪些
前置before:目标方法被调用之前执行
后置after:目标方法完成后调用(最后执行)
返回after-returning:目标方法执行成功后调用
异常after-throwing:目标方法抛出异常后调用
环绕around:包裹了目标方法,在目标方法执行之前和之后都会调用
(3)切点表达式有哪些
作用:知道对那个类里的那个方法进行增强
语法结构:execution([权限修饰符] [返回类型] [类全路径] [方法名称] ([参数列表]))
举例1:对com.ly.dao.BookDao类里的add方法进行增强
举例2:对com.ly.dao.BookDao类里的所有方法增强
举例3:对com.ly.dao包里的所有类的方法进行增强
53.Spring有哪些主要模块
大概有二十多个模块,分别为:核心容器、数据访问/集成、web、aop、工具、消息和测试 核心容器:以bean的方式组织和管理java应用中的各个组件及其关系。使用BeanFactory来产生和管理 Bean,是工厂模式的实现。BeanFactory使用控制反转模式将应用的配置和依赖性规范与实际的代码分 开。
54.Spring常用的注入方式有那些
构造方法注入、setter注入、基于注解的注入
55.spring中的bean是线程安全的吗
是否线程安全不一定,spring本身没有提供bean的线程安全策略,因此可以说spring中的bean不具备 线程安全的特性。但是spring中的bean默认为单例模式,如果此时bean处于无状态的情况,那么就可 以说是安全的,如果是有状态的那就是不安全的。要想使其安全,那就需要去修改bean的作用域。
(1)spring支持的bean作用域
1. singleton:默认的作用域,表示该bean为单实例
2. prototype:表示一个bean可以有多个实例
3. request:每次http请求都会创建一个request请求域
4. session:每一次会话会创建一个session作用域
5. application:表示全局web应用程序范围
(2)spring实例化bean的几种方式
1. 构造器方式(反射)
2. 静态工厂方式
3. 实例工厂方式
4. factoryBean方式
5. setter方式 execution(* com.ly.dao.BookDao.add(...)) execution(* com.ly.dao.BookDao.*(...)) execution(* com.ly.dao.*.*(...))
(3)spring自动装配bean的方式有哪些
1. 隐式的bean发现机制和自动装配
2. 在java代码或xml中进行显式配置 xml:和:定义依赖,自动覆盖注入 (不能注入基本数据类型) :手动注入(基本数据类型、字符串、类) 代码注解:@Autowired(现根据类型匹配,再根据名字匹配) @Resource(根据名字匹配)
(4)@Autowired与@Resource的区别
1. @Autowired可用于构造函数、成员变量、setter方法
2. 前者默认按照类型装配注入,默认情况下它要求依赖对象必须存在
3. 后者默认按照名称装配注入,只有当找不到名称匹配的bean才会按照类型装配注入
(5)什么是自动装配
spring容器可以自动装配相互合作的bean,可以通过bean工厂自动处理bean之间的协作。