手写spring ioc容器遇到的坑
遇到的问题
写web的时候发现,tomcat启动起来,但是无法注入自己手写的bean对象,查了原因发现,tomcat启动有自己的容器,换句话说,不会初始化我写的容器,解决办法是,自己手写了监听器,在web.xml中配置监听器,来完成容器对象中beans的初始化。
tomcat生命名周期及容器初始化过程
实现监听器
为什么是servlet监听器,不是session后者request监听器,因为按照spring创建的bean,大部分是singleton的,而且一次创建,整个项目可用。如果是session或者request监听器,那么每次新的session或者request就需要重新创建容器。
继承ServletContextListener 实现
public class BeanFactory implements ServletContextListener
实现ServletContextListener的方法
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);
void contextDestroyed(ServletContextEvent var1);
}
实现beans的加载
思路是:
- 根据项目根路径,扫描路径下所有类。
- 进行加载,并判断是否带有指定的自定义注解类。
- 有注解,加入map容器。
- 取map容器中的每个实例,遍历。
- 判断属性是否有@Autowired自定义注解,有就递归得到依赖关系。
- 这里容器的初始化基本完成。