模拟spring依赖注入,自定义注入类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shangshaohui2009/article/details/51967701
public class ClassScan {

/** 存放所有在基包下的类的全名 */
private List<String > classNames = new ArrayList<String>();

/** 存放service bean */
private Map<String, Object> serviceObjs = new HashMap<String, Object>();

/** 存放dao bean */
private Map<String, Object> repositoryObjs = new HashMap<String, Object>();


public ClassScan(String[] basePackageName){

this.scanBasePackage(basePackageName);//获取路径下所有的class文件

this.createBean();

this.injectBean();
}

/**
* 扫描给定的基包下的所有的类(包括子包)。
* @param basePackageName 基包的名称
*/
private void scanBasePackage(String[] basePackageNames) {

for (String basePackageName : basePackageNames) {

String packageDirName = basePackageName.replace(".", "/");
URL url  = Thread.currentThread().getContextClassLoader().getResource(packageDirName);
File targetFile = new File(url.getFile());
if(!targetFile.exists() || targetFile.isFile()){
throw new RuntimeException(basePackageName + "不是一个包名或者该包名不存在");
}
getAllClass(targetFile, basePackageName);

}
}

/**
* 得到所有在parentFile目录下的class文件名称
* @param parentFile 
* @param basePackageName 
*/
private void getAllClass(File parentFile, String basePackageName){

String basepath = basePackageName;

File[] files = parentFile.listFiles();
for(File file : files){
String path = file.getPath();
if (file.isFile()) {
if(path.endsWith(".class")){
classNames.add(basePackageName + "." + path.substring(path.lastIndexOf('\\') + 1, path.lastIndexOf('.')));
}
} else {
basePackageName = basepath + "."+path.substring(path.lastIndexOf('\\') + 1);
getAllClass(file, basePackageName);
basePackageName = basepath;
}
}
}


/**
* 根据获取的class文件 创建具体的实体类
* 并按照注解不同存放在不同的集合中
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private void createBean() {

for (String className : classNames) {
//System.out.println(className);
try {
//根据类全名 加载字节码
Class clazz = Class.forName(className);

//存放@MyService注解的
if (clazz.isAnnotationPresent(MyService.class)) {
MyService myService = (MyService) clazz.getAnnotation(MyService.class);
if (myService.value() != null && !"".equals(myService.value())) {
serviceObjs.put(myService.value(), clazz.newInstance());

} else {
serviceObjs.put(SimpleClassName(clazz.getSimpleName()), clazz.newInstance());
}

//存放@MyRepository注解的
} else if (clazz.isAnnotationPresent(MyRepository.class)) {
MyRepository myRepository = (MyRepository) clazz.getAnnotation(MyRepository.class);
if (myRepository.value() != null && !"".equals(myRepository.value())) {
repositoryObjs.put(myRepository.value(), clazz.newInstance());

} else {
repositoryObjs.put(SimpleClassName(clazz.getSimpleName()), clazz.newInstance());
}
}

} catch (Exception e) {
e.printStackTrace();
}
}

}

/**
* 处理bean上的注解
*/
private void injectBean() {

//为MyService注入
for (String key : serviceObjs.keySet()) {
Object bean = serviceObjs.get(key);
try {
//获取JavaBean的字段
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(MyResource.class)) {

MyResource myResource = field.getAnnotation(MyResource.class);
Object value = null;

if (myResource.name()!=null && !"".equals(myResource.name())) {
System.out.println("---按注解name注入");
value = repositoryObjs.get(myResource.name());
} else {
value = repositoryObjs.get(field.getName());//按字段名称
if (value == null) {
for (String key2 : repositoryObjs.keySet()) {
if (field.getType().isAssignableFrom(repositoryObjs.get(key2).getClass())) {
System.out.println("---按类型注入");
value = repositoryObjs.get(key2);
break;
}
}
} else {
System.out.println("---按字段名称注入");
}
}
field.setAccessible(true);
field.set(bean, value);
}
}

//通过內省获取JavaBean属性描述
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for (PropertyDescriptor descriptor : descriptors) {

Method setter = descriptor.getWriteMethod();//属性描述获取set方法,写方法
if (setter!=null) {
if (setter.isAnnotationPresent(MyResource.class)) {
MyResource myResource = setter.getAnnotation(MyResource.class);
String name = myResource.name();

Object value = null;

if (name!=null && !"".equals(name)) {
System.out.println("---按注解name注入");
value = repositoryObjs.get(name);
} else {

value = repositoryObjs.get(descriptor.getName());
if (value == null) {

for (String key2 : repositoryObjs.keySet()) {
if (descriptor.getPropertyType().isAssignableFrom(repositoryObjs.get(key2).getClass())) {
//System.out.println(descriptor.getPropertyType()+"====="+repositoryObjs.get(key2).getClass());
System.out.println("---按类型注入");
value = repositoryObjs.get(key2);
break;
}
}
} else {
System.out.println("---按字段注入");
}
}
setter.setAccessible(true);
setter.invoke(bean, value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

//为MyRepository注入
for (String key : repositoryObjs.keySet()) {
Object bean = repositoryObjs.get(key);

//获取JavaBean的字段
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {

if (field.isAnnotationPresent(MyResource.class)) {

try {
MyResource myResource = field.getAnnotation(MyResource.class);

Object value = null;

if (field.getType().isAssignableFrom(Integer.class)) {
value = myResource.intvalue();

} else if (field.getType().isAssignableFrom(String.class)) {
value = myResource.strvalue();

} else if (field.getType().isAssignableFrom(int.class)) {
value = myResource.intvalue();
}

field.setAccessible(true);
field.set(bean, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

//通过內省获取JavaBean属性描述
try {
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();

for (PropertyDescriptor descriptor : descriptors) {

Method setter = descriptor.getWriteMethod();
//System.out.println("setter:"+setter);

if (setter!=null) {
if (setter.isAnnotationPresent(MyResource.class)) {
MyResource myResource = setter.getAnnotation(MyResource.class);

Object value = null;

if (descriptor.getPropertyType().isAssignableFrom(Integer.class)) {
//if (setter.getParameterTypes()[0].isAssignableFrom(Integer.class)) {
value = myResource.intvalue();

   //} else if (setter.getParameterTypes()[0].isAssignableFrom(String.class)) {
} else if (descriptor.getPropertyType().isAssignableFrom(String.class)) {
value = myResource.strvalue();

} else if (descriptor.getPropertyType().isAssignableFrom(int.class)) {
value = myResource.intvalue();
}

//System.out.println("value值为:"+value);
setter.setAccessible(true);
setter.invoke(bean, value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

public Object getBean(String beanName){
Object obj = serviceObjs.get(beanName)==null?repositoryObjs.get(beanName):serviceObjs.get(beanName);
return obj;


/**
* 获取简单类名
* @param clazzName<br/>
* 如:AnimalServiceBean.java 简单类名为:animalServiceBean <br/>
* 而 CPUInfo.java 简单类名为:CPUInfo
* @return
*/
private String SimpleClassName(String clazzName) {

if (clazzName.length() >= 2) {
String a = clazzName.substring(1, 2);
String reValue = null;

if (a.equals(a.toUpperCase())) {
return clazzName;

} else {
reValue = clazzName.substring(0,1).toLowerCase()+clazzName.substring(1,clazzName.length());
return reValue;
}
}else {

return clazzName;
}

}

}

猜你喜欢

转载自blog.csdn.net/shangshaohui2009/article/details/51967701
今日推荐