Spring底层ICO容器注解注入的原理

引入

ICO容器是Spring重要的组成部分之一,IOC容器有两种Bean注入的方式,第一个是XML文档,第二个是注解注入,之前学Spring时一直想搞明白Spring是怎么利用注解将Value注入到属性中的。可能是我JavaSE基础没学好,最近才明白。

自定义注解

package BaseSpring.Bean;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;

/*
	元注解,是用来修饰自定义注解的注解。有四种元注解类型。
	1、Documented 
		一种标记注解类型,用于对一个注解类型进行标注,使该注解类型的实例包含在用javadoc工具产生的文档中。
	2、Inherited
		该元注解标注的注解类型,对于实例化类的所有子类都会继承该注解。
		如果父类使用的注解带有@Inherited标注,子类是可以获取到此注解的;如果父类使用的注解不带@Inherited标注,子类则无法获取到此注解。
		至于接口,无论接口使用的注解是否带有@Inherited标注,实现类都是无法获取到接口的注解的。
	3、Retention
		用于指明被标注的注解保留多长时间。Retention注解的值为RetentionPolicy枚举的一个成员。
			1、SOURCE:表示注解仅存与源文件中,注解将被编译器丢弃。
			2、CLASS:表示注解将保存在类文件中,但不被JVM保存的注解,是默认值。
			3、RUNTIME:表示要被JVM保存的注解,在运行时可以利用反射机制查询。
	4、Target
		用来指明哪个(哪些)程序元素可以利用该注解进行标注,Target的值来自ElementType枚举的成员。
			1、ANNOTATION:可以对注解类型进行标注。
			2、CONSTRUCTOR:可以对构造方法进行标注。
			3、FIELD:可以对成员的声明进行标注。
			4、LOCAL_VARIABLE:可以对局部变量进行标注。
			5、METHOD:可以对方法进行标注。
			6、PACKAGE:可以对包进行标注。
			7、PARAMETER:可以对参数声明进行标注。
			8、TYPE:可以对参数类型进行标注。
*/

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
    String value();
}

自定义数据库连接

package BaseSpring.Bean;

public class DataBaseConnect {

    @Value("admin")			//Value注入
    private String uname;
    @Value("123456")
    private String psw;
    @Value("localhost:8806//WWW")
    private String drive;

    public DataBaseConnect() {
    }

    public DataBaseConnect(String uname, String psw, String drive) {
        this.uname = uname;
        this.psw = psw;
        this.drive = drive;
    }

    public String getUname() {
        return uname;
    }

    public String getPsw() {
        return psw;
    }

    public String getDrive() {
        return drive;
    }

    @Override
    public String toString() {
        return "DataBaseConnect{" +
                "uname='" + uname + '\'' +
                ", psw='" + psw + '\'' +
                ", drive='" + drive + '\'' +
                '}';
    }
}

注解注入

package BaseSpring;

import BaseSpring.Bean.DataBaseConnect;
import BaseSpring.Bean.Value;
import java.lang.reflect.Field;

public class Spring {
    DataBaseConnect dbc;

    public  void joinBean() throws InstantiationException, IllegalAccessException {
        //反射机制
        Class<DataBaseConnect> dataBaseConnectClass = DataBaseConnect.class;
        //获取类的属性
        Field[] fields = dataBaseConnectClass.getDeclaredFields();
        //实例化连接
        dbc = dataBaseConnectClass.newInstance();
        //遍历类的属性
        for(Field field : fields){
        	//打开通道
            field.setAccessible(true);
            //获取注解中的值
            Value annotationVal = field.getAnnotation(Value.class);
            //利用反射机制注入
            field.set(dbc,annotationVal.value());
        }

    }

    public static void main(String[] args) {
        try {
            new Spring().joinBean();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

结尾

则只是一个测试用例,肯定有些值和属性有问题,但最后搞明白了如何利用反射机制将注解中的值注入到属性中,如果有不正确的欢迎指正。。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值