`
云上太阳
  • 浏览: 128284 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring IOC 原理 ,Java 反射实例,自定义注解

阅读更多

Spring IOC 原理 和 Java 反射实例

                                                                                                        ——我一直不太信任自己的记忆力,所以我把它们都写下来

        

       自从接触了Spring的各种思想后,真的是被各种设计征服了,当然Spring的各种设计基本上都需要扎实的java基础支持;比如SpringIOC(依赖注入,bean管理思想)运用到了Java注解、反射、xml等等。下面用一个实例来说明SpringIOC的原理。

 

 

       在SpringMVC项目中,对DAO和service一般都是spring注解管理的,像@Service,@Respository,@Component等。项目用Maven管理,文章末尾有svn地址和下载地址,代码里只要稍微有点晦涩的地方都有注释,有java经验的应该都能看懂。下面是项目结构图

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

anntation包下面是对@Resource,@Respository,@Service 的注解实现类;util包下面是java反射的相关类,dao和service包见文思意。测试入口在src/test/java下面。

 

 

MySpring.class 是主要的逻辑类,模拟了SpringIOC的ApplicationContext,所有的注册过的bean都可以从这里获得。完整的类如下

package com.albert.AnnotationTest;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

import com.albert.AnnotationTest.annotation.Resource;
import com.albert.AnnotationTest.annotation.Respository;
import com.albert.AnnotationTest.annotation.Service;
import com.albert.AnnotationTest.dao.MyDao;
import com.albert.AnnotationTest.service.MyService;
import com.albert.AnnotationTest.util.AlbertUtil;
import com.albert.AnnotationTest.util.ClassByPackage;

/**
 * @author albert
 * 这个类模拟Spring ioc 和mvc
 * 所有注解过的bean都从这里取得
 * 
 */
public class MySpring {
	/**
	 * 模拟Spring扫描的注解包
	 */
	private final static String packageName = "com.albert.AnnotationTest";
	/**
	 * 存放注解的bean对象
	 */
	private static Map<String,Object> beanMap = new HashMap<String, Object>();
	static{
		try {
			packageToScan();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 根据beanName从容器获取bean对象
	 * @param beanName
	 * @return
	 */
	public static Object getBean(String beanName){
		Object obj = null;
		obj = beanMap.get(beanName);
		return obj;
	}
	
	/**
	 * 遍历包中的注解类
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	private static void packageToScan() throws InstantiationException, IllegalAccessException{
		List<Class> clsList = ClassByPackage.getClasssFromPackage(packageName);
		//先加载dao
		for(Class cls : clsList){
                        //判断类是不是有@Respository注解
			if(cls.isAnnotationPresent(Respository.class)){
				String clsName = AlbertUtil.getBeanName(cls.getName());
				//bean对象存入map
				beanMap.put(clsName, cls.newInstance());
			}
		}
		//加载service,同时对其中@Resource注解的属性进行赋值
		for(Class cls : clsList){
			if( cls.isAnnotationPresent(Service.class)){
				String clsName = cls.getName();
				clsName = clsName.substring(clsName.lastIndexOf(".")+1, clsName.length());
				beanMap.put(AlbertUtil.toLowerCaseFirstOne(clsName), cls.newInstance());
				
				//扫描注解@Resource的属性并赋值
				Field[] field = cls.getDeclaredFields();
				for(Field f : field){
                                        //判断属性是不是有@Resource注解
					if(f.isAnnotationPresent(Resource.class)){
						f.setAccessible(true);
						f.set(beanMap.get(AlbertUtil.getBeanName(cls.getName())), beanMap.get(f.getName()));
					}
				}
			}
		}
	}
	
	
}

 项目SVN地址:http://code.taobao.org/svn/AnnotationTestAlbert/                                                                                

 

 

 

 


 

  • 大小: 65.9 KB
4
2
分享到:
评论
4 楼 zzjmates 2015-12-17  
      
zzjmates 写道
       

3 楼 云上太阳 2015-11-09  
楼下保持队形哈。。。哈哈哈
2 楼 PGKE 2015-11-09  
    
1 楼 zzjmates 2015-11-09  
       

相关推荐

    模拟Spring的IoC容器实现注解自动装配

    自己实现的简易的模拟Spring的IoC容器,实现注解自动装配

    IoC容器的设计(利用反射、注解和工厂模式实现)

    1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...

    Spring与IoC系列四:基于注解的依赖注入.rar

    Spring与IoC系列四:基于注解的依赖注入。对于DI使用注解,将不再需要在Spring配置文件中声明Bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变

    spring_Ioc

    spring ioc 采用注解方式实现Bean实例化和依赖注入

    SSM框架的学习与应用-Java EE企业级应用开发学习记录-(第六天)初识Spring框架

    在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring IoC的控制反转和简单工厂模式。 该资源主要包含以下内容(项目文件实例和注释齐全可以帮助你理): Spring框架简介:对Spring...

    javaspring 培训教程 TP1.docx

    2. Spring IOC:介绍控制反转概念,理解 xml 配置文件以及 使用注解进行配置的方法。详细阐述了 Spring 容器的加载过程, 以及依赖注入的实现原理。并且提供了一些基于 xml 配置和注 解的实例。

    《剑指offer》Java基础-反射篇.pdf

    Java基础 反射篇 反射的思想及作用 反射的基本使用 获取类的 Class 对象 构造类的实例化对象 获取一个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过...

    Java基础 反射篇.md

    反射是一个非常重要的知识点,在学习Spring 框架时,Bean的初始化用到了反射,在破坏单例模式时也用到了反射,在获取标注的注解时也会用到反射······ 当然了,反射在日常开发中,我们没碰到过多少,至少我没...

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解,包含ssh最新框架的集成,IOC注入,AOP面向切面编程.

    Spring攻略(第二版 中文高清版).part1

    1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 ...

    Spring攻略(第二版 中文高清版).part2

    1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 ...

    Spring 基于java的容器配置.docx

    @Bean注解用于指示方法实例化、配置和初始化由Spring IoC容器管理的新对象。对于那些熟悉Spring的 XML配置的人来说,@Bean注解的作用与元素相同。你可以对任何Spring @Component使用@Bean注解的方法,但是,它们最...

    struts+spring+hibernate 整合实例

    struts+spring+hibernate 整合实例。供学习三大框架整合人士学习之用,整合,spring 整合IOC 采用注解方式,

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    spring框架实例

    几乎全部涵盖了spring框架的整个使用,包括配置文件、IOC、AOP、jdbc、事务管理、注解等,注释也比较多,简单明了。

    spring.net中文手册在线版

    Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第...

    JAVA中spring介绍以及个人使用心得

    开发人员可以通过配置文件或注解来描述对象之间的关系,Spring框架负责实例化和管理这些对象。 面向切面编程(AOP):Spring框架支持面向切面编程(AOP),可以将横切关注点(如日志记录、事务管理)与应用程序的...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    spring.doc

    3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化(简单工厂模式) 14 3.3.3...

Global site tag (gtag.js) - Google Analytics