`
四叶螺旋桨
  • 浏览: 5338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过反射模拟spring实例化bean的小例子

 
阅读更多

 

Spring是通过org.springframework.context.support.ClassPathXmlApplicationContext来实例化bean的对象,然后供其他的对象进行调用。这个例子就是模拟java实例化Bean的这个过程。

 

主要用相关技术:反射,XML,jdom。

 

操作步骤:

1, 构建能够读取xml配置文件,并且能够实例化Bean的类ClassPathXmlApplicationContext.java

       (通过jdom读取配置文件信息,然后通过反射实例化类)

2, 准备Bean.xml配置文件,配置需要实例化类

3, 准备具体的实体类(Bean.xml配置的类)

4, 准备测试类,进行功能验证。

 

目的:

1, 更加深入了解Spring实例化的Bean的机制。

2, 扩展使用,不使用spring框架可以通过配置文件来决定需要实例化的类,而不用修改类本身。

 

废话少说,上代码了。

 

1, 创建ClassPathXmlApplicationContext.java, 为了便于扩展该类继承了BeanFactory接口

抽象一个BeanFactory的接口

 

 

package com.lch.spring;

public interface BeanFactory
{
	public Object  getBean(String id);
}

 

 

 

继承Bean的接口,创建ClassPathXmlApplicationContext 来模拟实例化Bean的过程

 

 

package com.lch.spring;

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

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

//模拟spring读取配置文件,生成对象实例的方式。
public class ClassPathXmlApplicationContext implements BeanFactory
{
	private Map<String, Object> beans = new HashMap<String, Object>();

	public ClassPathXmlApplicationContext() throws Exception,
			InstantiationException, IllegalAccessException,
			ClassNotFoundException
	{
		SAXBuilder sb = new SAXBuilder();

		Document doc = sb.build(this.getClass().getClassLoader()
				.getResourceAsStream("beans.xml"));
		Element root = doc.getRootElement();

		@SuppressWarnings("rawtypes")
		List list = root.getChildren("bean");

		for (int i = 0; i < list.size(); i++)
		{
			Element element = (Element) list.get(i);
			String id = element.getAttributeValue("id");
			String clazz = element.getAttributeValue("class");

			Object o = Class.forName(clazz).newInstance();

			beans.put(id, o);
			
			for(Element propertyElement : (List<Element>) element.getChildren("property"))
			{
				String name = propertyElement.getAttributeValue("name");
				String bean = propertyElement.getAttributeValue("bean");
				
				Object beanObject = beans.get(bean);
				
				String methondName = "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
				
				Method m = o.getClass().getMethod(methondName, beanObject.getClass().getInterfaces()[0]);
				
				m.invoke(o, beanObject);
				
//				beanObject.getClass().
			}

		}

	}

	@Override
	public Object getBean(String id)
	{
		return beans.get(id);
	}

}

 

验证ClassPathXmlApplicationContext  执行效果。

 

2,创建一个bean.xml的文件,配置关联关系。

 

<beans>
	<bean id="u" class="com.lch.dao.impl.UserDAO" />
	
	<bean id="userService" class="com.lch.service.UserService" >  
		<property name="userDAO" bean="u"/>
	</bean>
	
</beans>

 

 3, 构建实体类,具体实现的方法

 

package com.lch.dao

import com.lch.dao.UserDAO;
import com.lch.model.User;

public class UserDAO
{
	@Override
	public void save(User user)
	{
		// TODO Auto-generated method stub
		System.out.println("User save!!!! user = "+user.getUsername() +" , password = "+user.getPassword() );
	}
}
 
package com.lch.model;

public class User
{
	private String username;
	private String password;

	public String getUsername()
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public String getPassword()
	{
		return password;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

}
  
package com.lch.service;

import com.lch.dao.UserDAO;
import com.lch.model.User;

public class UserService
{
	private UserDAO userDAO;
	
	public void add(User user)
	{
		userDAO.save(user);
	}

	public UserDAO getUserDAO()
	{
		return userDAO;
	}

	public void setUserDAO(UserDAO userDAO)
	{
		this.userDAO = userDAO;
	}
	
}
 

 

4, 验证ClassPathXmlApplicationContext  执行效果。

 

package com.lch.service;

import org.junit.Test;

import com.lch.model.User;
import com.lch.spring.BeanFactory;
import com.lch.spring.ClassPathXmlApplicationContext;

public class UserServiceTest
{

	@Test
	public void testAdd() throws Exception
	{
		BeanFactory applicationContext = new ClassPathXmlApplicationContext();
		UserService service = (UserService) applicationContext
				.getBean("userService");

		User user = new User();
		user.setUsername("jack zhang");
		user.setPassword("zhang password");

		service.add(user);
	}
}
 

 

验证结果:
User save!!!! user = jack zhang , password = zhang password
分享到:
评论

相关推荐

    Spring实例化Bean顺序

    这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的...

    Spring 实例化Bean的三种方式

    Spring框架通过提供多种实例化Bean的方式,使得开发者能够根据具体的应用需求选择最适合的方法。无论是简单的构造器注入,还是更为复杂的静态或实例工厂方法注入,Spring都能够灵活地支持。理解并掌握这些实例化方式...

    Spring的三种实例化Bean的方式

    Spring支持使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解标记组件类,然后通过`@ComponentScan`在指定包下查找这些注解标记的类,实现Bean的自动实例化。例如: ```java @Component public ...

    spring IOC反射装载bean

    在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...

    Spring Bean创建初始化流程.docx

    在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...

    Spring项目bean实例化代码

    在Spring 3.0及以上版本,还可以通过注解配置实现Bean实例化,如使用`@Component`、`@Service`、`@Repository`和`@Controller`注解标记类为Bean,以及`@Autowired`进行依赖注入。此外,`@Bean`注解可以用于Java配置...

    Spring Bean实例化实现过程解析

    在 Spring 框架中,Bean 的实例化是通过容器来管理的,容器会根据配置文件中的信息来实例化 Bean。下面我们将详细介绍 Spring Bean 实例化的实现过程。 1. 构造器实例化 在 Spring 框架中,默认情况下,容器会通过...

    Spring实例化bean过程解析及完整代码示例

    通过上面的步骤我们可以看到,Spring实例化bean时,这个bean是在不断变化的!每个步骤都对bean实例进行了相应的操作,最终形成了一个完整的bean实例。 代码示例 为了更好地理解Spring实例化bean的过程,我们提供了...

    SpingIOC注入实例化bean

    无论是通过XML配置还是注解方式,Spring都能灵活地实例化和管理bean,使得开发者可以专注于业务逻辑,而不是对象的创建和管理。在实际项目中,理解和掌握Spring IOC的这些概念和用法是至关重要的。

    Sping学习笔记(2)----实例化Bean的三种方式

    自Spring 2.5引入注解支持后,可以通过在类或方法上使用注解来实例化Bean。最常用的是`@Component`(以及它的派生注解如@Service、@Repository、@Controller),它将类声明为Spring Bean。然后,通过`@Autowired`...

    实例化Spring bean的两种工厂方法

    在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念...

    浅谈springioc实例化bean的三个方法

    浅谈Spring IOC实例化Bean的三个方法 Spring IOC(Inversion of Control,控制反转)是Spring Framework中的一种核心机制,用于管理Bean的生命周期。实例化Bean是IOC的核心步骤之一,本文将详细讲解Spring IOC实例...

    使用反射和注解模拟Spring的依赖注入

    这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    如果一个BeanA依赖于另一个BeanB,同时BeanB也依赖于BeanA,那么Spring在处理依赖关系时可能会陷入循环引用,导致两个Bean都实例化两次。 3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行...

    Spring实例化bean的方式代码详解

    在Spring框架中,实例化bean是核心功能之一,它涉及到对象的创建、初始化和管理。本篇文章将详细探讨Spring实例化bean的三种主要方式,并提供相关的代码示例。这些方式包括使用类构造器、静态工厂方法以及实例化工厂...

    反射模拟springIOC.rar

    2. **Bean的创建**:解析完XML配置后,Spring容器会使用反射来实例化bean。通过`Class.forName()`方法加载指定的类,然后使用`newInstance()`或构造函数反射调用来创建对象。 3. **依赖注入**:Spring容器利用反射...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    在Java开发中,Spring框架是广泛使用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)...通过创建自定义注解和相应的处理器,我们可以模拟Spring的行为,为应用程序提供高度定制化的bean管理策略。

    spring bean life cycle

    1. **实例化**:Spring容器在遇到一个Bean定义时,会通过反射机制创建Bean实例。如果Bean定义中有`factory-method`属性,那么Spring会调用指定的方法来实例化Bean,而不是使用默认的构造器。 2. **属性注入**:实例...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    首先,我们需要从 beanDefinitionMap 中通过 beanName 获得 BeanDefinition,然后从 BeanDefinition 中获得 beanClassName,最后通过反射初始化 beanClassName 的实例 instance。构造函数从 BeanDefinition 的 ...

Global site tag (gtag.js) - Google Analytics