版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
/** 存放所有在基包下的类的全名 */
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;
}
}
}