简单实现Spring容器(二)
阶段2:
// 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.
2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.
思路:
1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是
key[beanName]–value[beanDefintion]
key--------->对应指定的名字,未指定则以类的首字母小写为其名字
value------->对应封装好的BeanDefintion对象
2.因为bean的作用域可能是singleton,也可能是prototype,所以Spring需要扫描到bean信息,保存到集合,这样当getBean()根据实际情况处理.
具体实现
1.加一个自定义Scope注解
package com.elf.spring.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author 45~
* @version 1.0
* Scope 可以指定一个Bean的作用范围[singleton,prototype]
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {
//通过value可以指定singleton,prototype
String value() default "";
}
2.在MonsterService.java上加上@Scope多实例注解
package com.elf.spring.component;
import com.elf.spring.annotation.Component;
import com.elf.spring.annotation.Scope;
/**
* @author 45~
* @version 1.0
* 说明 MonsterService 是一个Servic
*/
@Component //把MonsterService注入到我们自己的spring容器中
@Scope(value = "prototype")
public class MonsterService {
}
3.准备ioc包下写一个BeanDefinition.java 用于封装记录Bean信息.
package com.elf.spring.ioc;
/**
* @author 45~
* @version 1.0
* BeanDefinition 用于封装和记录Bean的信息 [1.scope 2.存放bean对应的Class对象,反射可以生成对应的对象]
* 2:因为将来getBean()时有可能是多实例,有可能是动态生成的,还要存放bean的class对象
*/
public class BeanDefinition {
private String scope;
private Class clazz;
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "BeanDefinition{" +
"scope='" + scope + '\'' +
", clazz=" + clazz +
'}';
}
}