`
chenzehe
  • 浏览: 538254 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

模拟Spring生成Bean

阅读更多

1、 原理

读取 Spring配置文件,解析出 Bean 属性,利用反射生成 Bean 实例

 

2 使用 Jsoup 解析配置文件,在 pom.xml 文件中加入 Jsoup 的依赖

 

3 创建 Bean 描述类BeanDefinition,有 bean id class 属性


package com.chenzehe.spring.myspring;
public class BeanDefinition{
    private String id;
    private String className;
    public BeanDefinition() {

    }
    public BeanDefinition(String id, String classPath){
        this.id = id;
        this.className = classPath;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
} 
 

 

 

4、创建生成读取配置文件和生成 Bean


package com.chenzehe.spring.myspring;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class ClassPathXmlApplicationContext {
    // 保存从配置文件中解析出来的 bean 属性
    private List<BeanDefinition> beans = new ArrayList<BeanDefinition>();
    // 保存实例化好的 bean
    private Map<String, Object> beansClass = new HashMap<String, Object>();
    /**
     * 根据 Bean 名称取得 Bean 实例
     */
    public Object getBean(String name) {
        return beansClass.get(name);
    }
    /**
     * 传入配置文件初始化
     */
    public ClassPathXmlApplicationContext(String xmlFilePath) {
        initBeansFromXML(xmlFilePath);
        initBeansClass();
    }
    /**
     * 从 beans 中读取 Bean 属性,使用反射实例化 Bean 对象
     */
    private void initBeansClass() {
        for (BeanDefinition bean : beans) {
            if (StringUtils.isNotBlank(bean.getClassName())) {
                try {
                    beansClass.put(bean.getId(),
                    Class.forName(bean.getClassName()).newInstance());
               } catch (Exception e) {
                    e.printStackTrace();
               }
           }
        }
    }
    /**
     * 使用 Jsoup 解析配置文件,把 bean 属性存到 beans
     */
    private void initBeansFromXML(String xmlFilePath) {
        try {
            Document doc = Jsoup.parse(new File(xmlFilePath), "UTF-8");
            Elements beanElements = doc.getElementsByTag("bean");
            for (Element element : beanElements) {
                 String id = element.attr("id");
                 String classPath = element.attr("class");
                 BeanDefinition bean = new BeanDefinition(id, classPath);
                 beans.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

分享到:
评论

相关推荐

    模拟spring工厂模式底层实现。

    在Spring框架中,工厂模式是核心的组件创建方式,它负责生成并管理Bean。Spring的IoC(Inversion of Control,控制反转)容器就是通过工厂模式来工作的,它使用了工厂方法来创建对象,实现了对象的创建与业务逻辑的...

    模拟spring IOC非常好的事例

    下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...

    动手写框架,模拟简易的SpringIOC.rar

    描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...

    Spring的经典面试题

    区分不同模块中的自动生成Bean - **区分方法**:通过`@Primary`注解或者`@Qualifier`注解来区分同类型的多个Bean,确保正确的Bean被注入。 ### Spring注解详解 #### 15. `@Required`注解 - **用途**:标记一个...

    spring3.2源码-官方原版.zip

    此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...

    TestNG-Spring-Example

    这些bean可以是模拟的服务、DAO或其他组件,以供测试用例使用。使用`@ContextConfiguration`注解指定这个配置文件的位置。 3. **编写测试类**:创建一个继承自`org.testng.spring.SpringTestNG`的测试类。这个基类...

    Spring 5源代码(spring-framework-5.3.14.zip)

    同时,Spring Data的查询方法更加灵活,允许开发者使用方法命名规则自动生成查询,极大地简化了数据访问层的编写。 在容器和依赖注入方面,Spring 5对Bean生命周期管理进行了改进,增强了对AOP(面向切面编程)的...

    spring javamail 来发送动态生成的3D图象.doc

    // 该方法模拟动态生成3D图像 private byte[] generate3DImage() throws IOException { // 实现此处的逻辑,例如使用JFreeChart库生成3D图像 // 返回图像的字节数组 } } ``` 在这个例子中,`generate3DImage`...

    spring-test-3.2.0.RELEASE.jar

    通过`@MockBean`注解,可以在Spring容器中注入一个Mock对象,而`@SpyBean`则可以创建一个部分模拟的Bean。同时,`when()`和`thenReturn()`等方法可以定义Mock对象的行为,实现精确的预期控制。 3. **Web应用测试:*...

    自主实现的简易Spring框架

    4. 注解解析器:解析类和方法上的注解,生成对应的Bean定义或切面规则。 5. AOP代理:用于拦截方法调用,实现切面的插入。 6. 依赖注入:根据Bean定义中的依赖关系,自动装配Bean的属性。 在深入学习这个简易Spring...

    spring-boot中文开发指南

    4. **Spring Initializr**:使用Spring Initializr在线生成项目结构,快速启动一个新的Spring Boot项目。 5. **Web开发**:学习使用Spring Boot和Spring MVC进行Web应用开发,包括RESTful API设计、模板引擎...

    hibernate+spring配置文件

    首先,我们需要在Spring的配置文件中引入Hibernate的相关bean,通常命名为`applicationContext.xml`。这个文件是Spring的IoC(Inversion of Control)容器的定义,它会管理所有bean的生命周期。 1. **Spring配置...

    spring中开发webservice

    开始开发Web服务前,我们需要在Spring配置文件中声明相关bean。这包括创建`WebServiceTemplate`以进行客户端调用,或者定义`AbstractWsConfigurer`或`@Bean`方法来配置服务器端的端点。 3. **创建Web服务端点...

    Thrift-server与spring集成

    - 使用Spring的`&lt;bean&gt;`标签定义Thrift服务接口的实现,并通过`@Autowired`注解注入必要的依赖。 4. **Thrift服务暴露**: - 在Spring配置中,设置Thrift服务器的监听端口和处理程序,启动服务器以提供服务。 - ...

    spring3.0jar和相关jar包

    - **全面支持JSR-303(Bean Validation)**:Spring 3.0集成Bean Validation API,提供数据验证功能,增强了业务逻辑层的数据校验能力。 - **Expression Language(SpEL)**:Spring Expression Language是一个...

    java文件生成xml文档

    总结起来,通过Java和JDOM库,我们可以方便地生成XML文档,模拟Spring框架中的bean配置。JDOM提供了丰富的API,使得处理XML文档变得直观且高效。在实际开发中,可以根据具体需求进一步完善XML文档的结构,添加更多的...

    spring-boot-test示例程序

    通过`@Autowired`注解注入需要的bean,并使用`@MockBean`或`@SpyBean`来创建mock对象,以便在测试中替换真实的依赖。 4. **集成测试**: 集成测试检查不同组件之间的交互,通常包括数据库、服务器等。在Spring ...

    spring-jdbcTemplate实例工程

    - **配置JdbcTemplate**:首先,需要在Spring配置文件中声明一个JdbcTemplate bean,并注入DataSource。 - **执行SQL**:调用JdbcTemplate的execute()方法执行SQL,对于查询操作,可以使用query()方法,传入SQL、...

    spring boot

    同时,`@MockBean`和`@WebMvcTest`等注解使得单元测试和模拟对象的创建变得简单。 ### Maven的jsdoc插件 在描述中提到了使用Maven的jsdoc插件来生成JavaScript的文档。Jsdoc是一个工具,用于生成基于JSDoc注释的...

    spring4视频教程

    - **Mockito 框架**:用于创建模拟对象,避免对外部依赖的真实调用。 - **Spring TestContext 框架**:提供了一种简便的方式来加载 Spring 上下文,方便测试 Spring 组件。 #### 六、Spring4 性能优化 - **缓存...

Global site tag (gtag.js) - Google Analytics