Spring是一种框架,为企业应用开发提供了一个轻量级的解决方案,包括基于依赖注入的核心机制、基于AOP的声明式事务管理、与多种持久层技术的整合。
1 什么叫依赖注入?
A对象需要调用B对象方法的情形即为A对象依赖B对象,普通的做法如下
首先创建一个UserDao类
package com.fly.user.dao; public class UserDao { public void save(){ System.out.println("保存一个用户"); } }
然后创建一个UserService类,当UserService类需要调用UserDao类里的save方法时即为UserService依赖UserDao
package com.fly.user.service; import com.fly.user.dao.UserDao; public class UserService { UserDao userDao = new UserDao(); public void userSave(){ userDao.save(); } }
这种做法耦合度太高,非常不利于项目的维护
那么使用Spring实现UserService如下
package com.fly.user.service; import com.fly.user.dao.UserDao; public class UserService { private UserDao userDao; public void userSave(){ userDao.save(); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
这里使用setter放法来注入被依赖的UserDao对象,而不是通过new,那么Spring是怎么实现这种注入的呢?主要通过applicationContext.xml配置文件来实现(文件名可以随便改)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd "> <bean id="userService" class="com.fly.user.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="com.fly.user.dao.UserDao"></bean> </beans>
Spring里一切java对象皆为Bean,至于Spring底层如何解析该xml文件需要去读源码以及相关java反射的原理,后续我也会写相关的博文
接下来用一个TestUser类来测试运行型
package com.fly.user; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.fly.user.service.UserService; public class TestUser { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); userService.userSave(); } }
鼠标右键Run As->Java Application得到如下结果
九月 01, 2016 2:45:11 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1d1c0f9c: startup date [Thu Sep 01 14:45:11 CST 2016]; root of context hierarchy
九月 01, 2016 2:45:11 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
保存一个用户
这些就是Spring依赖注入的实现,这里用到的Spring的Jar包现在需要到http://repo.spring.io/release/org/springframework/spring/地址下进行下载,还需要commons-logging的jar包,下载地址为http://commons.apache.org/proper/commons-logging/download_logging.cgi
Spring推荐面向接口编程,后续会优化为面向接口的实现方式