文章目录
- IOC思路
- 手写代码思路
- 一些杂七杂八(可跳过)
IOC思路
手写代码思路
手写代码的思路:
- 自定义一个MyAnnotationConfigApplicationContext,构造器中传入要扫描的包。
- 获取这个包下的所有类。
- 遍历这些类,找出添加了@Component注解的类,获取它的Class和对应的beanName,封装成一个BeanDefinition,存入集合Set。这个集合就是loC自动装载的原材料。(为什么用set集合,因为要去重,保证唯一性,set有序且不重复)
- 遍历Set集合,通过反射机制创建对象,同时检测属性有没有添加@Value注解,如果有还需要给属性赋值,再将这些动态创建的对象以k-v的形式存入缓存区。
- 提供getBean等方法,通过beanName取出对应的bean即可。
一些杂七杂八(可跳过)
传统java web:
- servlet层里注入service层,service层里注入Dao层
- 一般service层,Dao层都是先写一个接口,再写一个接口的实现类impl
- Dao层是数据库操作层,也叫mapper层,持久层
注入:
private HelloService helloService = new HelloServiceImpl();
本来Dao层注入到service层是需要new的,我们在两者中间插入一个工厂类,工厂类里写个方法getDao获取Dao对象(Dao对象即为Dao接口类,它的实现写到DaoImpl里)
// private HelloDao helloDao = new HelloDaoImpl(); //这里是要new的,ioc就是不用去new了
private HelloDao helloDao = BeanFactory.getDao(); //不new了,用工厂