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框架中,工厂模式是核心的组件创建方式,它负责生成并管理Bean。Spring的IoC(Inversion of Control,控制反转)容器就是通过工厂模式来工作的,它使用了工厂方法来创建对象,实现了对象的创建与业务逻辑的...
下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...
描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...
区分不同模块中的自动生成Bean - **区分方法**:通过`@Primary`注解或者`@Qualifier`注解来区分同类型的多个Bean,确保正确的Bean被注入。 ### Spring注解详解 #### 15. `@Required`注解 - **用途**:标记一个...
此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...
这些bean可以是模拟的服务、DAO或其他组件,以供测试用例使用。使用`@ContextConfiguration`注解指定这个配置文件的位置。 3. **编写测试类**:创建一个继承自`org.testng.spring.SpringTestNG`的测试类。这个基类...
同时,Spring Data的查询方法更加灵活,允许开发者使用方法命名规则自动生成查询,极大地简化了数据访问层的编写。 在容器和依赖注入方面,Spring 5对Bean生命周期管理进行了改进,增强了对AOP(面向切面编程)的...
// 该方法模拟动态生成3D图像 private byte[] generate3DImage() throws IOException { // 实现此处的逻辑,例如使用JFreeChart库生成3D图像 // 返回图像的字节数组 } } ``` 在这个例子中,`generate3DImage`...
通过`@MockBean`注解,可以在Spring容器中注入一个Mock对象,而`@SpyBean`则可以创建一个部分模拟的Bean。同时,`when()`和`thenReturn()`等方法可以定义Mock对象的行为,实现精确的预期控制。 3. **Web应用测试:*...
4. 注解解析器:解析类和方法上的注解,生成对应的Bean定义或切面规则。 5. AOP代理:用于拦截方法调用,实现切面的插入。 6. 依赖注入:根据Bean定义中的依赖关系,自动装配Bean的属性。 在深入学习这个简易Spring...
4. **Spring Initializr**:使用Spring Initializr在线生成项目结构,快速启动一个新的Spring Boot项目。 5. **Web开发**:学习使用Spring Boot和Spring MVC进行Web应用开发,包括RESTful API设计、模板引擎...
首先,我们需要在Spring的配置文件中引入Hibernate的相关bean,通常命名为`applicationContext.xml`。这个文件是Spring的IoC(Inversion of Control)容器的定义,它会管理所有bean的生命周期。 1. **Spring配置...
开始开发Web服务前,我们需要在Spring配置文件中声明相关bean。这包括创建`WebServiceTemplate`以进行客户端调用,或者定义`AbstractWsConfigurer`或`@Bean`方法来配置服务器端的端点。 3. **创建Web服务端点...
- 使用Spring的`<bean>`标签定义Thrift服务接口的实现,并通过`@Autowired`注解注入必要的依赖。 4. **Thrift服务暴露**: - 在Spring配置中,设置Thrift服务器的监听端口和处理程序,启动服务器以提供服务。 - ...
- **全面支持JSR-303(Bean Validation)**:Spring 3.0集成Bean Validation API,提供数据验证功能,增强了业务逻辑层的数据校验能力。 - **Expression Language(SpEL)**:Spring Expression Language是一个...
总结起来,通过Java和JDOM库,我们可以方便地生成XML文档,模拟Spring框架中的bean配置。JDOM提供了丰富的API,使得处理XML文档变得直观且高效。在实际开发中,可以根据具体需求进一步完善XML文档的结构,添加更多的...
通过`@Autowired`注解注入需要的bean,并使用`@MockBean`或`@SpyBean`来创建mock对象,以便在测试中替换真实的依赖。 4. **集成测试**: 集成测试检查不同组件之间的交互,通常包括数据库、服务器等。在Spring ...
- **配置JdbcTemplate**:首先,需要在Spring配置文件中声明一个JdbcTemplate bean,并注入DataSource。 - **执行SQL**:调用JdbcTemplate的execute()方法执行SQL,对于查询操作,可以使用query()方法,传入SQL、...
同时,`@MockBean`和`@WebMvcTest`等注解使得单元测试和模拟对象的创建变得简单。 ### Maven的jsdoc插件 在描述中提到了使用Maven的jsdoc插件来生成JavaScript的文档。Jsdoc是一个工具,用于生成基于JSDoc注释的...
- **Mockito 框架**:用于创建模拟对象,避免对外部依赖的真实调用。 - **Spring TestContext 框架**:提供了一种简便的方式来加载 Spring 上下文,方便测试 Spring 组件。 #### 六、Spring4 性能优化 - **缓存...