抽象类和接口的区别?
答:抽象类中可以没有抽象方法,接口中的方法必须是抽象方法;
抽象类中可以有普通的成员变量,接口中的变量必须是 static final 类型的,必须被初始化,接口中只有常量,没有变量;
抽象类只能单继承,接口可以继承多个父接口;
Java 8 中接口中会有 default 方法,即方法可以被实现。
Spring
IoC(Inverse of Control:控制反转)是一种设计思想
两种实现: 依赖查找(DL)和依赖注入(DI)。
- 将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,IoC 容器是 Spring 用来实现 IoC 的载体,IoC 容器实际上就是个Map(key,value) Map 中存放的是各种对象。
- 将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合
- 程序员自己创建和维护的一大堆bean统统交由Spring管理。
Bean的生命周期
- 项目启动扫描类生成beanDefinistion①
- beanFactory - creatBean(BeanDefinistion) - 推断构造方法
- InstantiationAwareBeanPostProcessor before 进行扩展
- spring实例化
- InstantiationAwareBeanPostProcessor after 进行扩展
- (依赖注入)属性填充 ②
- 调用BeanNameAware.setBeanName()方法
- 调用BeanFactoryAware.setBeanFactory()方法
- 调用ApplicationContextAware.setApplicationContext()方法
- BeanPostProcessor before 进行扩展
- 调用Initializing.afterPropertiesSet()方法(即属性值设置完后)定义一些初始化的逻辑 初始化③
- BeanPostProcessor after 进行扩展
- 销毁 Destruction
①扫描bean定义存放在beanDefinistionMap是ConcurrentHashMap <beanmane beanDifinstion对象> getbean(xxx)从上面Map去查找,beanDefinistionMap存放在beanFactory它的creatBean(BeanDefinistion)基于bean的定义去创建bean,方法里面根据推断构造方法
②bean和普通对象 spring创建对象生命周期的时候会自动注入属性填充
③可以用来检测检查某些属性有没有设置值
@Autowired注解 先byType byName 从spring容器(Map:beanmane object)中获取值
spring容器 单例池 beanFactory applicationContext
BeanFactory是Spring框架的基础设施,面向Spring本身;
ApplicationContext面向使用Spring的开发者,相比BeanFactory提供了更多面向实际应用的功能(获取资源发布信息环境信息等),几乎所有场合都可以直接使用ApplicationContext而不是底层BeanFactory
applicationContext实现了BeanFactory接口但是代码中是直接使用default…BeanFactory属性不用去实现BeanFactory方法
依赖注入方式 1. set(property标签) 2.构造方法(constructor-arg标签)接口注入。还要看看
简述 Spring IoC 的实现机制?
- 其实就是工厂模式加反射机制。
- 分为低级容器和高级容器,其实就是BeanFactory,首先加载配置文件,解析成BeanDefinition放在map里。调用getBean方法,从BeanDefinition所属的map里,拿出Class对象进行实例化,同时如果存在依赖关系,将递归调用getBean方法。
- 高级容器的话就是ApplicationContext,包含了低级容器的功能,当执行refersh的方法,刷新整个容器的bean,还有其他功能,访问文件资源,事件发布通知等。
BeanDefintion是什么?
顾名思义,就是bean的定义,根据xml或者注解的配置信息生成相应的bean详情对象。BeanDefinition和xml有个对应关系。
FactoryBean与BeanFactory的区别
FactoryBean是一种特殊的 Bean,需要注册到 IoC 容器,通过容器 getBean获取getObject():返回有FactoryBean创建的Bean实例,而 BeanFactory#getBean 则是依赖查找,如果 Bean 没有初始化,那么将从底层查找或构建。
BeanFactory是IOC的底层容器,FactoryBean是创建Bean的一种方式,帮助实现复杂的初始化逻辑。
ConcurrentHashMap 和 HashTable 的区别? (必问)
答:ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。
HashMap 没有考虑同步,HashTable 考虑了同步的问题,
但是 HashTable 在每次同步执行时都要锁住整个结构。
ConcurrentHashMap 锁的方式是稍微细粒度的,同时将 Hash 表分为 16 个桶(默认值),诸如 get、put、remove 等常用操作只锁当前需要用到的桶。
ConcurrentHashMap 的具体实现知道吗?
答:该类包含两个静态内部类 HashEntry 和 Segment;前者用来封装映射表的键值对,后者用来充当锁的角色;Segment 是一种可重入的锁 ReentrantLock,每个 Segment 守护一个 HashEntry 数组里得元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 锁。