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; } }
相关推荐
这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的...
Spring框架通过提供多种实例化Bean的方式,使得开发者能够根据具体的应用需求选择最适合的方法。无论是简单的构造器注入,还是更为复杂的静态或实例工厂方法注入,Spring都能够灵活地支持。理解并掌握这些实例化方式...
Spring支持使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解标记组件类,然后通过`@ComponentScan`在指定包下查找这些注解标记的类,实现Bean的自动实例化。例如: ```java @Component public ...
在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...
在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...
在Spring 3.0及以上版本,还可以通过注解配置实现Bean实例化,如使用`@Component`、`@Service`、`@Repository`和`@Controller`注解标记类为Bean,以及`@Autowired`进行依赖注入。此外,`@Bean`注解可以用于Java配置...
在 Spring 框架中,Bean 的实例化是通过容器来管理的,容器会根据配置文件中的信息来实例化 Bean。下面我们将详细介绍 Spring Bean 实例化的实现过程。 1. 构造器实例化 在 Spring 框架中,默认情况下,容器会通过...
通过上面的步骤我们可以看到,Spring实例化bean时,这个bean是在不断变化的!每个步骤都对bean实例进行了相应的操作,最终形成了一个完整的bean实例。 代码示例 为了更好地理解Spring实例化bean的过程,我们提供了...
无论是通过XML配置还是注解方式,Spring都能灵活地实例化和管理bean,使得开发者可以专注于业务逻辑,而不是对象的创建和管理。在实际项目中,理解和掌握Spring IOC的这些概念和用法是至关重要的。
自Spring 2.5引入注解支持后,可以通过在类或方法上使用注解来实例化Bean。最常用的是`@Component`(以及它的派生注解如@Service、@Repository、@Controller),它将类声明为Spring Bean。然后,通过`@Autowired`...
在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念...
浅谈Spring IOC实例化Bean的三个方法 Spring IOC(Inversion of Control,控制反转)是Spring Framework中的一种核心机制,用于管理Bean的生命周期。实例化Bean是IOC的核心步骤之一,本文将详细讲解Spring IOC实例...
这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
如果一个BeanA依赖于另一个BeanB,同时BeanB也依赖于BeanA,那么Spring在处理依赖关系时可能会陷入循环引用,导致两个Bean都实例化两次。 3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行...
在Spring框架中,实例化bean是核心功能之一,它涉及到对象的创建、初始化和管理。本篇文章将详细探讨Spring实例化bean的三种主要方式,并提供相关的代码示例。这些方式包括使用类构造器、静态工厂方法以及实例化工厂...
2. **Bean的创建**:解析完XML配置后,Spring容器会使用反射来实例化bean。通过`Class.forName()`方法加载指定的类,然后使用`newInstance()`或构造函数反射调用来创建对象。 3. **依赖注入**:Spring容器利用反射...
在Java开发中,Spring框架是广泛使用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)...通过创建自定义注解和相应的处理器,我们可以模拟Spring的行为,为应用程序提供高度定制化的bean管理策略。
1. **实例化**:Spring容器在遇到一个Bean定义时,会通过反射机制创建Bean实例。如果Bean定义中有`factory-method`属性,那么Spring会调用指定的方法来实例化Bean,而不是使用默认的构造器。 2. **属性注入**:实例...
首先,我们需要从 beanDefinitionMap 中通过 beanName 获得 BeanDefinition,然后从 BeanDefinition 中获得 beanClassName,最后通过反射初始化 beanClassName 的实例 instance。构造函数从 BeanDefinition 的 ...