Java面试准备(二)spring

【拦截器和过滤器的区别?】
过滤器依赖servlet容器,基于函数回调实现,在容器初始化时调用一次,几乎可以过滤所有资源包括静态文件。
拦截器基于web框架比如springmvc,基于反射实现运用aop,可以多次调用,但只能拦截controller,无法拦截静态文件。
【springmvc流程?】
核心组件:
前端控制器 DispacherServlet
处理器映射器 HandleMapping
处理器适配器 HandleAdapter
Handle
视图解析器 ViewResovle

1.发送请求前端控制器 DispacherServlet
2. DispacherServlet调用处理器映射器HandleMapping,生成处理器对象和拦截器
3.DispatcherServlet 再调用处理器适配器HandleAdapter找到对应的handle
4.调用handle,返回模型视图,前端控制器再调用视图解析器解析视图
5.DispatcherServlet 对视图进行渲染,返回给用户。
【SpringMvc怎么和AJAX相互调用的?】
SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
【springmvc中文乱码怎么解决?】
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;

CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8



CharacterEncodingFilter
/

【常用注解哪些?】
@Autowired @Configuration @Import @ImportResource @Bean @Controller, @Service, @Component @Qualifier @RequestBody @RequestParam @PathVariable
【简单说下aop?】
面向切面编程,将独立的功能抽取出来,解耦,spring的事务、mvc的拦截器就是使用aop。
【动态代理有哪些,有什么区别?】
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
【在spring中如何使用动态代理的?】
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
【如何强制使用CGLIB实现AOP?】
(1)添加CGLIB库,SPRING_HOME/cglib/.jar
(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>
【spring事务实现方式有哪些?】
实现方式共有两种:编码方式;声明式事务管理方式。
编码式事务就是在代码中调用commit rollback方法。
声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。
事务的传播机制(支持或不支持事务的配置)transaction注解参数
【事务的特征有哪些?】
原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。
一致性(Consistency):数据不会因为事务的执行而遭到破坏。
隔离性(Isolation):一个事务的执行,不受其他事务(进程)的干扰。既并发执行的个事务之间互不干扰。
持久性(Durability):一个事务一旦提交,它对数据库的改变将是永久的。
【事务的隔离级别有几种?分别是什么?】
(1)read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
(2)read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
(3)repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
(4)serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读
分布式事务
分布式锁
【ioc和di的理解?】
IOC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IOC更简单的诠释。
原来对象由开发者自己new出来,现在对象的创建交由spring容器,权限反转。
动态的创建一个对象所需要的其他依赖对象,类似打针注入。Controller中用的service调用就需要注入service。
【说说ioc容器有哪些?】
BeanFactory和它的子接口ApplicationContext
BeanFactory提供基本的框架配置
ApplicationContext提供了更完备的功能
【ApplicationContext和BeanFactory的优缺点?】
ApplicationContext,在启动的时候就把所有的Bean全部实例化了。好处是可以预先加载,坏处是浪费内存。
BeanFactory实例化对象时,配置的bean不会马上被实例化,而是等到你使用该bean的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。
【ApplicationContext实例化的三种方式?】
FileSystemXmlApplicationContext 默认是去项目的路径下加载
ClassPathXmlApplicationContext 默认会去 CLASSPATH 路径下找
WebXmlApplicationContext 该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。这是为Web工程量身定制的,使用WebApplicationContextUtils类的getWebApplicationContext方法可在JSP与Servlet中取得IOC容器的引用.
【spring ioc bean什么时候实例化?】
1.BeanFactory作为Spring Bean的工厂类 ,第一次使用该Bean的时候实例化。
2.ApplicationContext作为Spring Bean的工厂类,看作用域和懒加载标识。
单例(scope=singleton )lazy-init为false(默认是false),ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候,直接从这个缓存中取,取到的是同一个实例。
单例(scope=singleton )lazy-init为true,第一次使用该Bean的时候实例化。
多例(scope=prototype),第一次使用该Bean的时候实例化。
【bean的生命周期】
6个阶段
加载bean定义——bean实例化——属性赋值()——()初始化()启动完毕——使用——kill销毁
详解
(1)加载bean定义:(把 @Bean @Component加到bean定义信息里,会检查有没同名的实例)
(2)属性赋值也就是ioc注入,比如controller中的service赋值(注入)
(3)2个扩展
1.属性赋值之后初始化前,有一个aware接口的扩展,加载资源到spring容器
2.初始化前后,有一个beanpostprocessor前置/后置处理
(4)aware接口
BeanNameAware:可以批量修改bean的名字
BeanFactoryAware
ApplicationContextAware:通常不用BeanFactoryAware,这个内容更丰富,常见的应用有—获取接口的实现类,就是使用ApplicationContextAware的拓展
beanpost通常是对bean的内容做修改,可以用于缓存技术。
(5)销毁会调用接口DisposableBean的destroy方法。
【bean的作用域?】
singleton 只有一个实例,也即是单例模式(spring默认)。
prototype 访问一次创建一个实例,相当于new。
request 每次web请求创建实例
session 每次会话
global-session 全局会话
【Controller是单例的吗?】
默认是单例的,不止是Controller所有的组件默认都是
【怎么监控查询的Controller一个url被调用多少次?】
因为Controller是单例的,因此,成员变量是属于同一个单例,Controller定义一个成员变量,url的方法里 i++。
【你知道BeanPostProcessor吗?它是在什么时候执行?】
在bean生命周期中的初始化前后,有一个beanpostprocessor前置/后置处理
【你知道aware接口扩展吗?它是在什么时候执行的?】
在bean生命周期中,属性赋值之后初始化之前,有一个aware接口的扩展。
【spring依赖注入方式有几种,分别是什么?】
构造器注入
set方法属性注入(不需要对应构造方法)
接口注入(不常用)
注解 :属性自动装配 @Autowired
【注解和xml的方式如何测试spring?】
xml
ApplicationContext context = new ClassPathXmlApplicationContext(“classpath:applicationContext.xml”);
MyBean myBean = (MyBean)context.getBean(“myBean”);
注解
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
MyBean myBean = (MyBean)context.getBean(“myBean2”);
【Spring的事务管理机制实现的原理?】
Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。
【 @Transactional什么时候不生效?】
1.springmvc下controller上的@Transactional不生效的,应该是过滤掉controller层
通常mvc会扫描controller,spring如果再扫描controller就会重复扫描,transactional也不会交给spring管理事务。
2. 检查型异常不回滚,如FileNotFoundException
3. @Transactional只作用在public修饰符上才有效
4.spring和springmvc配置重复扫描service,导致JDBC连接没交给spring管理
【aop的应用场景有哪些?】
spring的事务、mvc的拦截器
【Spring 定时任务执行原理?】
Spring 定时任务实际上通过 JDK 提供的 ScheduledExecutorService执行。默认情况下,Spring 将会生成一个单线程ScheduledExecutorService执行定时任务。所以一旦某一个定时任务长时间阻塞这个执行线程,其他定时任务都将被影响,没有机会被执行线程执行。
Spring 这种默认配置,在需要执行多个定时任务的情况,可能会是一个坑。我们可以通过改变配置,使 Spring 采用多线程执行定时任务。
【spring多线程定时任务怎么做?】
Spring 将会查找 TaskScheduler/ScheduledExecutorService,若存在将会使用。
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(2);
return taskScheduler;
}
【springboot自动配置原理?】
@SpringBootApplication里有@EnableAutoConfiguration ,@EnableAutoConfiguration里再@Import({EnableAutoConfigurationImportSelector.class})
他的父类AutoConfigurationImportSelector里面的selectImports方法会去寻找META-INF/spring.factories配置文件,配置文件里配置的EnableAutoConfiguration的自动配置类(比如springboot-autoconfigure META-INF/spring.factories 自动配置类)
根据自动配置类进行装配
【springboot三大特点?】
自动配置、起步依赖、Actuator对运行状态的监控
【SpringBoot 打成的 jar 和普通的 jar 有什么区别?】
Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
【Spring Boot 是否可以使用 XML 配置 ?怎么做?】
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
【ImportSelector接口有什么作用?】
主要作用是收集需要导入的配置类,如果该接口的实现类同时实现EnvironmentAware, BeanFactoryAware ,BeanClassLoaderAware或者ResourceLoaderAware,那么在调用其selectImports方法之前先调用上述接口中对应的方法,如果需要在所有的@Configuration处理完在导入时可以实现DeferredImportSelector接口。

猜你喜欢

转载自blog.csdn.net/x18094/article/details/113835582
今日推荐