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中的“AbstractOrientedProgram”可能指的是抽象面向编程,这是Spring框架实现DI的一种方式。Spring通过定义抽象类或接口,允许开发者专注于业务逻辑,而不是如何创建和管理对象。这种方式降低了代码的...
2. **AOP(Aspect Oriented Programming)**:Spring提供了面向切面编程的支持,使得我们可以编写横切关注点,如日志、事务管理等,而无需污染业务代码。`org.springframework.aop`包是实现AOP的基础,包括代理模式...
Spring的核心功能包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务管理等。 - **主页**: <http://spring.io/> - **文档**: <http://docs.spring.io/spring/docs...
对于JDBC事务,Spring提供了一种统一的事务管理接口`PlatformTransactionManager`,它抽象了底层数据源的事务管理细节。常见的实现有`DataSourceTransactionManager`,它适用于传统的JDBC操作。当在Spring中配置了`...
Spring 2.5.6是该框架的一个稳定版本,发布于2009年,它提供了许多功能,包括依赖注入、面向切面编程、事务管理以及与各种数据库、Web服务器和Java EE服务的集成。这个压缩包包含了开发Spring 2.5.6应用所必需的全部...
Spring框架是Java开发中最常用的轻量级框架之一,它的核心组件包括IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。Spring4.0版本是该框架的一个重要里程碑,它引入了多...
2. **AOP(面向切面编程)**:Spring提供了AOP支持,允许开发者定义和执行横切关注点,如日志、事务管理等。3.2版本进一步优化了代理实现,提升了性能,并添加了更多的通知类型。 3. **数据访问**:Spring提供了...
5. **接口使用**:鼓励使用接口编程,因为Spring通过接口进行依赖注入,提供更好的可替换性和可测试性。 **IOC(DI)配置及应用** - **IOC/DI**:控制反转(IOC)是指对象的创建和管理由Spring容器负责,依赖注入...
3. **Spring AOP(面向切面编程)**:提供了一个全面的AOP实现,允许我们在不修改源代码的情况下,插入额外的功能,如日志、事务管理等。它支持使用注解定义切面,简化了AOP的使用。 4. **Spring JDBC**:提供了一...
Spring.NET提供了丰富的功能,包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)、数据访问抽象、事务管理等,旨在简化.NET应用程序的开发,提高可测试性和可维护性。...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能,以及对Java EE服务的全面抽象和集成,极大地简化了...
本文档主要围绕面向抽象编程、JDOM的基本使用、Spring功能模拟、Spring运行环境搭建,以及核心特性IOC(依赖注入)展开,旨在帮助读者掌握Spring的核心技术和实践技巧。 首先,面向抽象编程是Spring设计哲学的基础...
此外,Spring AOP(面向切面编程)允许开发者定义横切关注点,如日志、安全和缓存,这些关注点可以跨越多个类和方法。在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中...
编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则通过在配置文件或注解中定义事务规则,让Spring自动处理事务开始、提交、回滚等操作。...
3. **数据访问**:Spring提供了JDBC抽象层,简化了数据库操作,同时支持ORM(Object-Relational Mapping)框架,如Hibernate、MyBatis等,使得对象与数据库表之间的映射变得更加简单。 4. **Web开发**:Spring MVC...
Spring 3.x中的关键特性包括依赖注入、面向切面编程(AOP)、事务管理、数据访问抽象等。 1. 依赖注入:依赖注入是Spring的核心特性之一,它允许将对象的依赖关系交给Spring容器来管理。这通过XML配置文件、注解或...
Spring.NET框架是一个开源的企业级应用开发框架,它为.NET开发者提供了强大的依赖注入(Dependency Injection,DI)和面向方面的编程(Aspect-Oriented Programming,AOP)能力。Spring.NET的灵感来源于Java平台上的...