Spring是一个轻量级框架,Spring最基本、最核心的的jar包括 : beans、context、core、expression。
- spring-core.jar : 这个jar包 包含spring框架基本的核心工具类,这是其他组件的基本核心。
- spring-beans.jar : 这个jar包是所有应用都能用到的,它包含了访问配置文件、 创建和管理Bean (BeanFactory)、进行IOC/DI操作相关的类。
(BeanFactory能添加和管理bean,其底层是通过IOC :控制反转(Inversion of Control,IoC)的方式来管理bean。IOC是一种设计思想,它将传统的程序中的对象依赖关系由直接依赖改为间接依赖,实现了程序中各个模块的解耦,降低了模块间的耦合度,提高了代码的可维护性和可复用性。
ps :
BeanFactory是属于旧方式的管理Bean的方式,开发中一般使用ApplicationContext方式来替代BeanFactory来管理bean。)- spring-context.jar : 这个jar包功能是建立在 core和beans 的基础上实现的,他在基础的IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。
ps :
spring-context.jar 中的 ApplicationContext 能替代 BeanFactory 的添加和管理Bean,开发中更常用。ApplicationContext管理bean底层也是IOC。- spring-expression.jar : 主要用于在Spring应用中表达和解析表达式。该功能在Spring 3.0中引入。
第一步、在DIEA中创建一个Java项目,添加web功能模块。
第二步、在项目WEB-INF目录中创建lib文件夹,存放Spring框架最基本核心的jar包,让jar包生效。
获取spring框架基本核心jar包第三步、创建UserDao接口 和 UserDaoImpl实现类
UserDao.java (接口)public interface UserDao { public void say(); }
UserDaoImpl.java (实现类)
public class UserDaoImpl implements UserDao{ //实现类 //重写实现类中的方法 @Override public void say() { System.out.println("UserDaoImpl say hello World !"); } }
第四步、创建ApplicationContext.xml,其中添加和配置bean的信息 ( 用ApplicationContext的方式来在IOC容器中添加和管理bean)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 将UserDaoImpl这个类交给Spring容器管理,即Beans管理,让其创建对象的实例 --> <!-- 通过创建 ApplicationContext的方式来添加和管理Bean --> <bean id="userDaoImpl" class="com.myh.ioc.UserDaoImpl"/> </beans>
第五步、创建ApplicationContext获得bean,创建测试类使用bean。
public class TestIoC { public static void main(String[] args) { //1.初始化spring容器,加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); //2.通过容器获得userDaoImpl实例 UserDaoImpl userDaoImpl = (UserDaoImpl)applicationContext.getBean("userDaoImpl"); //3.调用实例职工的say()方法 userDaoImpl.say(); } }
依赖注入( Dependency Injection, 简称DI) 与 控制反转 (loC) 的含义相同,只不过这两个称呼是从两个角度描述的同一个概念 ( 不同角度下描述的同一概念 )。
当某个Java对象 (调用者) 需要调用另一个Java对象( 被调用者,即被依赖对象)时。在 传统模式 下,调用者通常会采用 “new被调用者” 的代码方式来创建对象,如下图所示。这种方式会导致调用者 与 被调用者之间的 耦合性增加,不利于后期项目的升级和维护。
在使用Spring 框架之后,对象的实例不再由调用者来创建,而是由Spring 容器来创建。
Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的 控制反转 ( IOC )。从Spring容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量,这相当于为
调用者注入了它依赖的实例,这就是Spring的 依赖注入 ( DI) ,如下图所示。
ps :
控制主导权有“调用者” 转变为 “spring容器”,控制权发生转变,叫“控制反转” ( IOC ),控制反转的实际操作是 : “依赖注入” ( DI )。
依赖注入的作用就是在使用Spring 框架创建对象时,动态右地将其所依赖的对象注入Bean组件中,其实现方式通常有两种,一种是属性 setter方法注入,另一种是 构造方法注入,具体介绍如下。
属性setter方法注入 : (最为常用)
指Spring容器使用setter方法注入被依赖的实例(对象)。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入。构造方法注入 :
指Spring容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。属性setter方法注入的例子:
UserService.java
public interface UserDao { public void say(); }
UserServiceImpl.java
public class UserServiceImpl implements UserService{ //声明UserDao属性 (被调用者实例) private UserDao userDao; // "userDao"为 Bean实例中相应的 “属性名” //添加UserDao属性的setter方法,用于依赖注入 public void setUserDao(UserDao userDao){ this.userDao = userDao; } //实现接口中的方法 @Override public void say() { //调用userDao中的say()方法 this.userDao.say(); System.out.println("userServiceImpl say hello World!"); } }
ApplicationContext.xml (其中添加以下代码)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 将UserDaoImpl这个类交给Spring容器管理,即Beans管理,让其创建对象的实例 --> <!-- 通过创建 ApplicationContext的方式来添加和管理Bean --> <bean id="userDaoImpl" class="com.myh.ioc.UserDaoImpl"/> <!-- 在IOC容器中创建一个id为“userServiceImpl“的Bean,该Bean用于实例化 UserServiceImpl类的信息 --> <bean id="userServiceImpl" class="com.myh.ioc.UserServiceImpl"> <!-- 将id为"userDao"的Bean实例注入到 userService实例中 --> <!-- name : 表示Bean实例中相应的 “属性名” ref : 用于指定其属性值 --> <property name="userDao" ref="userDaoImpl"/> <!-- property标签用于调用Bean实例中的 setUserDao() 方法完成属性赋值 --> </bean> </beans>
TestDI.java (测试类)
public class TestDI { public static void main(String[] args) { //1.初始化spring容器,加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); //2.通过容器获取UserService实例 UserServiceImpl userServiceImpl = (UserServiceImpl) applicationContext.getBean("userServiceImpl"); //getBean()中参数为配置bean对应的id名 //3.调用实例中的say()方法 userServiceImpl.say(); } }
以上为Spring容器 属性setter注入 的方式,也是实际开发中最为常用的一种方式。