`

spring简单模拟(面向抽象/接口编程)

 
阅读更多

1.实体类

User.java

package com.test.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;
	}
}

 

2.数据访问对象(dao-data access object)

UserDAO.java

package com.test.dao;

import com.test.model.User;

public interface UserDAO {
	public void save(User user);
}

 

3.实现dao层类

UserDAOImpl.java

package com.test.dao.impl;

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

public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

 

4.服务类

UserService.java

package com.test.service;

import com.test.dao.UserDAO;
import com.test.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;
	}
}

 

5.依赖注入userDao(以下是核心部分)

(1)配置文件

beans.xml

<beans>
	<bean id="userDAOImpl" class="com.test.dao.impl.UserDAOImpl" />
	<bean id="userService" class="com.test.service.UserService">
		<property name="userDAO" bean="userDAOImpl" />
	</bean>
</beans>

 

说明:property标签中name属性值(userDao)UserService服务类中的成员变量,在此配置文件中,它配置的实现类是UserDAOImpl

(2)bean工厂接口类

BeanFactory.java

package com.test.spring;

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

 

(3)实现bean工厂类

ClassPathXmlApplicationContext.java

package com.test.spring;

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

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

public class ClassPathXmlApplicationContext implements BeanFactory {

	private Map<String, Object> beans = new HashMap<String, Object>();

	// IOC(Inverse of Control):控制反转
	// DI(Dependency Injection):依赖注入
	public ClassPathXmlApplicationContext() throws Exception {
		SAXBuilder sb = new SAXBuilder();
		Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
		Element root = doc.getRootElement(); // 获取根元素beans
		List list = root.getChildren("bean");// 取名字为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"); // userDAO
				String bean = propertyElement.getAttributeValue("bean"); // userDAOImpl
				Object beanObject = beans.get(bean);// UserDAOImpl实例
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
				// 指定对象o本身的类的methodName方法的参数为:beanObject实现的那个接口
				Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
				// 调用对象o中的methodName方法(参数为:UserDAOImpl实例),相当于o.methodName(beanObject);
				m.invoke(o, beanObject);
			}
		}
	}

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

}

 

6.jUnit测试类

UserServiceTest.java

package com.test.service;

import org.junit.Test;

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

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		BeanFactory applicationContext = new ClassPathXmlApplicationContext();
		UserService service = (UserService) applicationContext.getBean("userService");
		User u = new User();
		u.setUsername("zhangsan");
		u.setPassword("123");
		service.add(u);
	}

}

 

分享到:
评论

相关推荐

    面向接口编程

    在Spring教程.docx文档中,可能会详细讲解如何使用Spring进行面向接口编程,包括配置XML或使用注解的方式来声明接口的实现,以及如何通过Spring的IoC容器获取和使用接口实例。这通常会涉及`@Autowired`注解、`@...

    尚学堂_Spring_0100_模拟Spring

    首先,Spring中的“AbstractOrientedProgram”可能指的是抽象面向编程,这是Spring框架实现DI的一种方式。Spring通过定义抽象类或接口,允许开发者专注于业务逻辑,而不是如何创建和管理对象。这种方式降低了代码的...

    spring-spring-framework-4.3.24.RELEASE.zip

    2. **AOP(Aspect Oriented Programming)**:Spring提供了面向切面编程的支持,使得我们可以编写横切关注点,如日志、事务管理等,而无需污染业务代码。`org.springframework.aop`包是实现AOP的基础,包括代理模式...

    spring +hibernate 详解与配置(附图)

    Spring的核心功能包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务管理等。 - **主页**: &lt;http://spring.io/&gt; - **文档**: &lt;http://docs.spring.io/spring/docs...

    Spring 事务简单完整例子

    对于JDBC事务,Spring提供了一种统一的事务管理接口`PlatformTransactionManager`,它抽象了底层数据源的事务管理细节。常见的实现有`DataSourceTransactionManager`,它适用于传统的JDBC操作。当在Spring中配置了`...

    spring2.5.6开发必备jar包(全)

    Spring 2.5.6是该框架的一个稳定版本,发布于2009年,它提供了许多功能,包括依赖注入、面向切面编程、事务管理以及与各种数据库、Web服务器和Java EE服务的集成。这个压缩包包含了开发Spring 2.5.6应用所必需的全部...

    Spring4.0 jar包

    Spring框架是Java开发中最常用的轻量级框架之一,它的核心组件包括IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。Spring4.0版本是该框架的一个重要里程碑,它引入了多...

    spring3.2参考文档

    2. **AOP(面向切面编程)**:Spring提供了AOP支持,允许开发者定义和执行横切关注点,如日志、事务管理等。3.2版本进一步优化了代理实现,提升了性能,并添加了更多的通知类型。 3. **数据访问**:Spring提供了...

    Spring的学习笔记

    5. **接口使用**:鼓励使用接口编程,因为Spring通过接口进行依赖注入,提供更好的可替换性和可测试性。 **IOC(DI)配置及应用** - **IOC/DI**:控制反转(IOC)是指对象的创建和管理由Spring容器负责,依赖注入...

    spring4.0完整jar包

    3. **Spring AOP(面向切面编程)**:提供了一个全面的AOP实现,允许我们在不修改源代码的情况下,插入额外的功能,如日志、事务管理等。它支持使用注解定义切面,简化了AOP的使用。 4. **Spring JDBC**:提供了一...

    Spring.Net的实例

    Spring.NET提供了丰富的功能,包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)、数据访问抽象、事务管理等,旨在简化.NET应用程序的开发,提高可测试性和可维护性。...

    Spring3中文帮助文档

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能,以及对Java EE服务的全面抽象和集成,极大地简化了...

    spring框架案例学习文档笔记.pdf

    本文档主要围绕面向抽象编程、JDOM的基本使用、Spring功能模拟、Spring运行环境搭建,以及核心特性IOC(依赖注入)展开,旨在帮助读者掌握Spring的核心技术和实践技巧。 首先,面向抽象编程是Spring设计哲学的基础...

    spring-framework-2.5.5

    此外,Spring AOP(面向切面编程)允许开发者定义横切关注点,如日志、安全和缓存,这些关注点可以跨越多个类和方法。在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中...

    Spring事务管理开发必备jar包

    编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则通过在配置文件或注解中定义事务规则,让Spring自动处理事务开始、提交、回滚等操作。...

    spring-framework-master.zip

    3. **数据访问**:Spring提供了JDBC抽象层,简化了数据库操作,同时支持ORM(Object-Relational Mapping)框架,如Hibernate、MyBatis等,使得对象与数据库表之间的映射变得更加简单。 4. **Web开发**:Spring MVC...

    spring 3.x企业应用开发实战

    Spring 3.x中的关键特性包括依赖注入、面向切面编程(AOP)、事务管理、数据访问抽象等。 1. 依赖注入:依赖注入是Spring的核心特性之一,它允许将对象的依赖关系交给Spring容器来管理。这通过XML配置文件、注解或...

    spring.net框架参考文档

    Spring.NET框架是一个开源的企业级应用开发框架,它为.NET开发者提供了强大的依赖注入(Dependency Injection,DI)和面向方面的编程(Aspect-Oriented Programming,AOP)能力。Spring.NET的灵感来源于Java平台上的...

Global site tag (gtag.js) - Google Analytics