ORM、IOC、DI概念以及DI结合注解的使用

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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值