java面试题整理( 四 )


1.volatile是轻量级的
2.多线程并发访问volatile不会阻塞
3.volatile只保证可见性 , 不能保证原子操作
五十.ThreadLocal 是怎么解决并发安全的?
每个线程存储的是本地变量副本 , 没有共享数据 。 线程当然安全了 。 但是线程中是无法获取到在主线程中设置的ThreadLocal的值的 。 他的一个子类可以 。
五十一.什么是spring , 有哪些模块?
java框架 , 模块包括spring core、spring web、spring mvc、spring context、spring dao、spring orm、spring dao
五十二.使用spring框架带来哪些好处?
解耦、aop、声明式事务、对其他框架开放、
五十三.BeanFactory 和 ApplicationContext 有什么区别?
ApplicationContext继承自BeanFactory , 前者丰富了很多功能 。 如:国际化、aop、加载上下文... 并且Application是对于bean预加载的 , 而BeanFactory是懒加载的 。
五十四.spring有几种配置方式?
xml、注解、java类
xml:
注解: @Component("userDao")
public class userDao{......}
java:使用@Configuration注解需要作为配置的类 , 表示该类将定义Bean的元数据 , 使用@Bean注解相应的方法 , 该方法名默认就是Bean的名称 , 该方法返回值就是Bean的对象 。
五十五.springBean生命周期?
java面试题整理文章插图
创建-》初始化-》使用-》销毁
五十六.Spring bean元素的作用域?

  • 当通过Spring容器创建一个Bean实例的时候 , 不仅可以完成bean实例的实力化 , 还可以为bean指定作用域 。 Spring bean元素的支持以下5种作用域:
  • Singleton:单例模式 , 在整个spring IOC容器中 , 使用singleton定义的bean将只有一个实例 。
  • Prototype:多例模式 , 每次通过容器中的getBean方法获取prototype定义的beans时 , 都会产生一个新的bean的实例 。
  • Request:对于每次Http请求 , 使用request定义的bean都会产生一个新的实例 , 只有在web应用时候 , 该作用域才会有效 。
  • Session:对于每次Http Session , 使用session定义的Bean都将产生一个新的实例 。
  • Globalsession:每个全局的Http Sesisonn , 使用session定义的本都将产生一个新的实例 。
五十七.spring inner beans?
在bean中声明另一个bean作为属性
五十八.spring中的bean是线程成安全的吗?
  • Spring框架并没有对单例的bean进行多线程的封装处理 , 线程安全问题和并发问题 , 需要我们开发者自己考虑 。
  • 但实际上 , 大部分的Spring bean并没有可变的状态(比如:service类和dao类) , 所有在某种程度上来说Spring单例bean是线程安全的 。 如果bean有多种状态的话(比如:View Model对象) , 就需要自行考虑线程安全问题 。
五十九.什么是自动装配?
  • 就是将一个Bean注入到其它的Bean的Property中 , 默认情况下 , 容器不会自动装配 , 需要我们手动设定 。 Spring 可以通过向Bean Factory中注入的方式来搞定bean之间的依赖关系 , 达到自动装配的目的 。
  • 自动装配建议少用 , 如果要使用 , 建议使用ByName
六十.@Required
@Required 注释应用于 bean 属性的 setter 方法 , 它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中 , 否则容器就会抛出一个 BeanInitializationException 异常 。
六十一.autowired和resource?
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上 。
2.@Autowired默认按类型装配(这个注解是属业spring的) , 默认情况下必须要求依赖对象必须存在 , 如果要允许null值 , 可以设置它的required属性为false , 如:@Autowired(required=false), 如果我们想使用名称装配可以结合@Qualifier注解进行使用