ORM、IOC、DI概念以及DI结合注解的使用
ORM:对象关系映射,实体类与关系数据库之间的映射
IOC:控制反转,将创建对象的权力从代码中剥离出来,以其他形式体现,例如配置文件
优点:使用反射和配置文件的形式创建对象,可以通过调整配置文件,灵活的切换实现类,不需要修改代码,也不需要重新编译,降低了层次跟层次之间的耦合度
DI:Dependency injection 依赖注入:使用反射给属性赋值(结合注解使用)
主方法
package cglib.testDI;
public class Test {
public static void main(String[] args) throws Exception {
Mountain bean = (Mountain) BeanFactory.getBean("cglib.testDI.Mountain");
System.out.println(bean);
Temple temple = bean.getTemple();
System.out.println(temple);
}
}
给属性赋值的方法:
package cglib.testDI;
import java.lang.reflect.Field;
public class BeanFactory {
public static Object getBean(String name) throws Exception {
Class muuntainCalzz = Class.forName(name);
Object o = muuntainCalzz.newInstance();
//读取字节码中所偶遇属性上的注解 通过注解的值给属性赋值
Field[] fs = muuntainCalzz.getDeclaredFields();
for (Field f : fs) {
//读取属性上的注解
MyValue annotation = f.getAnnotation(MyValue.class);
if (annotation != null){ //注解不为空
f.setAccessible(true);
//读取注解信息 给属性赋值
String value = annotation.initValue();
//判断属性的数据类型 根据类型解析value
if (f.getType() == int.class){
f.set(o,Integer.parseInt(value));
}else if (f.getType() == double.class){
f.set(o,Double.parseDouble(value));
}else if (f.getType() == boolean.class){
f.set(o,Boolean.parseBoolean(value));
}else if (f.getType() == char.class){
f.set(o,value.charAt(0));
}else if (f.getType() == String.class){
f.set(o,value);
}else {
//引用类型,创建这类引用类型的对象 赋值给f的属性
/*Object o1 = Class.forName(value).newInstance();
f.set(o,o1);*/
Object bean = getBean(value);
f.set(o,bean);
}
}
}
return o;
}
}
Temple类
package cglib.testDI;
public class Temple {
@MyValue(initValue = "少林寺")
private String name; //庙
@MyValue(initValue = "cglib.testDI.OldMonk")
private OldMonk oldMonk;
@MyValue(initValue = "cglib.testDI.YoungMonk")
private YoungMonk youngMonk;
@Override
public String toString() {
return "Temple{" +
"name='" + name + '\'' +
", oldMonk=" + oldMonk +
", youngMonk=" + youngMonk +
'}';
}
}
注解
package cglib.testDI;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyValue {
String initValue();
}