引入
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();
}
}
}
结尾
则只是一个测试用例,肯定有些值和属性有问题,但最后搞明白了如何利用反射机制将注解中的值注入到属性中,如果有不正确的欢迎指正。。