静态的特点以及注意方式?
静态的特点
①static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用。
②优先于对象存在,被所有对象所共享。
③静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
④静态会随着类的消失而消失,说明他的生命周期最长。
注意方式
①静态方法只能访问静态成员。
②静态方法不可以定义this,super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this。
③主函数是静态的。
优缺点
优点: 把对象的数据进行单独空间的存储,节省空间,没有必要每个对象中的存储一份,可以直接被类名调用(Person country)
缺点: 生命周期过长。访问出现局限性。(只能访问静态)
对静态局部变量
①静态局部变量在静态存储区分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
②为静态局部变量赋初始值是编译时进行赋值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
③如果定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。
自动装配的方式有哪些?
自动装配一共有五种。
①AUTOWIRE_NO(no):默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
②AUTOWIRE_BY_NAME(byName):通过bean的名称进行自动装配。如果一个bean和property与另一个bean的name相同,就进行自动装配。
③AUTOWIRE_BY_TYPE(byType):通过参数的数据类型进行自动装配。
④AUTOWIRE_CONSTRUCTOR(constructor):利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
⑤自动探测,如果有构造方法,通过construct的方式自动装配,否则使用byType的方式自动装配。
什么是Spring IOC容器,优点有哪些?
Spring的IOC(Inversion of Control,控制反转) 是一种设计模式,它将对象的创建和依赖关系的管理管理从应用程序代码中分离出来,交给Spring容器来完成。在Spring中,IOC是通过依赖注入(Dependency Injection,DI)来实现的。
Spring IOC优点
①降低了组件之间的耦合度:通过IOC容器来管理组件之间的依赖关系,可以将组件之间的耦合度降低到最小,从而提高了代码的可维护性和可扩展性。
②提高了代码的可测试性:由于依赖关系被IOC容器管理,所以可以很方便地进行单元测试和集成测试。
③提高了代码的可读性:通过IOC容器来管理依赖关系,可以使代码更加清晰、简洁,易于理解和维护。
④提高了代码的灵活性:通过IOC容器来管理依赖关系,可以很方便地进行组件的替换和升级,从而提高了代码的灵活性和扩展性。
总之:Spring IOC是一种非常重要的设计模式,它可以帮组我们更好地管理组件之间的依赖关系,提高代码的可维护性、可测试性、可读性和灵活性。
@Component、@Controller、@Repository、@Service有何区别?
@Component
@Component(把普通pojo实例化到Spring容器中)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Service等的时候),我们就可以使用@Component来标注这个类。
@Controller
@Controller控制器(注入服务、用在Controller层),用于标注控制层,相当于Struts中的action层
@Repository
@Repository(实现dao访问、用在Mapper层)用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。
@Service
@Service服务(注入dao、用在Service层)用于标注服务层,主要用来进行业务的逻辑处理。
进程和线程的区别
进程
进程是系统分配资源和调度的基本单位,也就是说进程可以单独运行一段程序。
线程
线程是CPU调度和分派的最小基本单位。
区别
①一个进程可以包含至少一个线程,一般来说也就是主线程,而一个线程只能属于一个进程。
②进程拥有独立的内存,而线程没有独立的资源空间,只是暂时存储在计数器,寄存器,栈中,同一个进程间的线程可以共享资源。
③将代码放入到代码区之后,进程产生,但还没有执行,我们所说的执行一般是主线程main函数开始执行。
④进程比线程更加消耗资源。
⑤进程对资源的保护要求高,而线程要求不高。
⑥进程是处理器这一层面的抽象,而线程是进程的基础上进一步并发的抽象。
⑦同一个进程下,一个线程的挂掉,会导致整个进程的挂掉,而进程之间不会相互影响。
⑧总的来说,我们都知道程序不能单独运行,只有将它放入内存中,分配资源才能运行,程序是指令的集合,而进程是程序的一次执行活动,属于动态概念。
⑨我们可以打个比方:进程相当于某一个大型项目,世界上可能有人同时在做这个项目,有其独特的方式;而线程就相当于这个项目下的一些程序员,多个程序员去完成这一个项目肯定要比一个人完成快得多,也就是能在同一时间操作。
决定同步
①互斥锁:同一个线程下,当某个线程使用进程的共享资源时,其他线程必须等待该线程结束。
②信号量:进程拥有同一时间最大访问数量。
请对Spring的通知类型进行简要说明?
环绕通知
实现接口:org.aopalliance.itercept.MethodInterceptor
功能描述:在目标方法执行前和执行后实施增强。可以用于日志记录、事务处理等功能。
前置通知
实现接口:org.springframework.aop.MethodBeforeAdvice
功能描述:在目标方法执行前实施增强。可以用于权限管理等功能。
后置返回通知
实现接口:org.springframework.aop.AfterReturningAdvice
功能描述:在目标方法成功执行后实施增强。可以用于关闭流、删除临时文件等功能。
后置(最终)通知
实现接口:org.springframework.aop.AfterAdvice
功能描述:在目标方法执行后实施增强。与后置返回通知不同的是,不管是否发生异常都要执行该通知,可应用于释放资源。
异常通知
实现接口:org.springframework.aop.ThrowsAdvice
功能描述:在方法抛出异常后实施增强。可以用于异常处理、记录日志等工鞥呢。
引入通知
实现接口:org.springframework.aop.IntroductInterceptor
功能描述:在目标类中添加一些新的方法和属性。可以用于修改目标类(增强类)。
请简述ModelAndView、String和void三种返回类型的作用?
ModelAndView
ModelAndView类型中可以添加Model数据,并指定视图。
String
String类型的返回值可以跳转视图,但不能携带数据。
void
void类型主要在异步请求时使用,它只返回 数据,而不会跳转视图。
请简述文件上传时表单需要满足的3个条件?
第一要素
提交方式必须为post请求。
第二要素
表单的enctype属性是多部分表单形式,及enctype="multipart/form-data"。
第三要素
表单项type="file"。
请简述SSM框架的整合思路?
一共21个流程

1、需求分析
2、写数据库表
3、新建maven项目并导入依赖
4、配置好web.xml版本和jdk版本
5、创建项目结构类名
6、连接数据库
7、创建实体类对象
8、编写dao接口和mapper文件
9、编写mybatis主配置文件
10、编写service接口和实现service接口
11、创建applicationContext.xml总配置文件
12、编写jdbc.properties配置文件
13、编写spring-dao层配置文件
14、编写spring-service层配置文件
15、创建test测设底层是否有误
16、编写spring-mvc层配置文件
17、编写web.xml配置文件
18、配置并发布服务器
19、编写Controller层代码
20、写前端页面
21、优化代码