java 反射 模拟spring自动注入
2017-01-13 16:44
337 查看
基于反射和注解机制,简单模拟spring解析Autowired注解的过程。
1、自定义Autowired注解,代码如下
[java] view
plain copy
package com.basic.reflect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface Autowired {
//注解的name属性
public String name() default "";
}
2、定义相关的业务和Dao类,以及获取Bean的容器(在容器中基于反射实现自动注入)
[java] view
plain copy
public class PersonDao {
public int add(Object o) {
System.out.println("dao autowird ok ");
return 0;
}
}
public class ServiceImpl {
@Autowired
private PersonDao personDao;
public int addPerson(Object obj) {
return personDao.add(obj);
}
}
public class BeanContainer {
public static Object getBean(String name) {
try {
Class<?> clazz = Class.forName("com.basic.reflect.ServiceImpl");
Object bean = clazz.newInstance();
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
if (f.isAnnotationPresent(Autowired.class)) {
// 基于类型注入
Class<?> c = f.getType();
Object value = c.newInstance();
//允许访问private字段
f.setAccessible(true);
//把引用对象注入属性
f.set(bean, value);
}
}
return bean;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
3、测试类
[java] view
plain copy
public class Test {
public static void main(String[] args) {
ServiceImpl impl = (ServiceImpl) BeanContainer.getBean("service");
String name = "test";
impl.addPerson(name);
}
}
总结,上面的代码简单模拟了Spring解析Autowired的过程,写的比较简单,但是精髓已经写到了,主要就是利用反射机制生成实例并且解析注解对其属性进行赋值。其实Spring框架的核心Ioc和Aop的实现,还是利用了Java最基本的东西,比如Aop就是利用了动态代理,Ioc就是利用了反射机制
1、自定义Autowired注解,代码如下
[java] view
plain copy
package com.basic.reflect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface Autowired {
//注解的name属性
public String name() default "";
}
2、定义相关的业务和Dao类,以及获取Bean的容器(在容器中基于反射实现自动注入)
[java] view
plain copy
public class PersonDao {
public int add(Object o) {
System.out.println("dao autowird ok ");
return 0;
}
}
public class ServiceImpl {
@Autowired
private PersonDao personDao;
public int addPerson(Object obj) {
return personDao.add(obj);
}
}
public class BeanContainer {
public static Object getBean(String name) {
try {
Class<?> clazz = Class.forName("com.basic.reflect.ServiceImpl");
Object bean = clazz.newInstance();
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
if (f.isAnnotationPresent(Autowired.class)) {
// 基于类型注入
Class<?> c = f.getType();
Object value = c.newInstance();
//允许访问private字段
f.setAccessible(true);
//把引用对象注入属性
f.set(bean, value);
}
}
return bean;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
3、测试类
[java] view
plain copy
public class Test {
public static void main(String[] args) {
ServiceImpl impl = (ServiceImpl) BeanContainer.getBean("service");
String name = "test";
impl.addPerson(name);
}
}
总结,上面的代码简单模拟了Spring解析Autowired的过程,写的比较简单,但是精髓已经写到了,主要就是利用反射机制生成实例并且解析注解对其属性进行赋值。其实Spring框架的核心Ioc和Aop的实现,还是利用了Java最基本的东西,比如Aop就是利用了动态代理,Ioc就是利用了反射机制
相关文章推荐
- java 反射 模拟spring自动注入
- java 反射,spring 自动注入原理
- java的反射原理与Spring的自动注入(转载)
- java反射模拟spring依赖注入
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- 使用java反射优化Spring自动生成的DAO实现类!
- 利用java的反射机制和dom4j 模拟spring核心
- [Java] Spring 3.0 /id.vs.name/简单属性的注入/bean中的scope属性/集合注入/自动装配/生命周期/
- Java反射及依赖注入简单模拟
- 重回Java开发-利用反射模拟Spring
- 关于非Spring管理下的Bean通过反射在newInstance()下的自动注入问题
- Java反射—模拟Spring的Aop
- 不同的包下有文件名相同的java类,spring自动注入会报错
- 使用JAVA注解和反射模拟spring的IOC
- 【JAVA】Spring 自动注入类注释详解
- java 反射调用Service导致Spring注入Dao失效
- Java反射及依赖注入简单模拟
- java-spring与mongodb的整合方式一 自动注入xml
- java简单模拟Spring的依赖注入