1.1 IOC简介
IoC(Inverse Of Control)控制反转:即,把创建对象的权利交给框架,也就是指将对象的创建、对象的初始化、对象的存储、对象的管理交给了Spring容器。IOC本质是一种设计思想。
IoC 是一种通过描述来生成或者获取对象的技术,对于Java初学者 更多时候所熟悉的是使用 new 关键字来创建对象,而在spring中则不是,它是通过描述(XML或注解)来创建对象。
在 Spring 中把每一个需要管理的对象称之为 Spring Bean(简称为Bean),而Spring中管理这些 Bean 的容器,被我们称之为 Spring IoC 容器(简称 IoC容器)
在此之前,当需要对象时,通常是利用new关键字创建一个对象:
/* 创建一个User对象——这里使用new对象的方式造成了程序之间的耦合性提升 */
User u = new User();
但由于new对象,会提高类和类之间的依赖关系,即代码之间的耦合性。
而现在我们可以将对象的创建交给框架来做:
// 获取Spring IoC容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// 从spring的IoC容器中获取User对象
private User user = (User)ctx.getBean("user");
将需要的POJO提前在配置文件(XML或注解)中进行描述,Spring会根据配置文件将其中所描述生成 IoC容器并装配Bean,在需要使用时,再次获取即可
这样一来,当需要对象时不用自己创建,而是通过框架获取即可,不用硬编码去new对象,自然就降低类和类之间的依赖关系,也就是耦合性。
2.1 入门案例
在Spring中允许我们通过XML或注解方式装配Bean,下面先来介绍Spring中通过XML方法如何装配Bean。
扩展:
idea里的project 相当于 eclipse里的 workspace
idea里的module 相当于eclipse里的project 为了迎合现在的模块形式开发。
module可以称之为模块或者是子项目,依赖于父项目(project) . 开发时一般都是开发的module,因此父项目的src可以删掉
隐藏不想看到的文件或者文件夹
File—>settings—>Editor—>File Types—>ignored Files and Folders —->点击+号, 输入想要隐藏的内容,回车
2.2. 创建module
先创建父工程spring-demo,然后再创建module,命名spring-ioc1
<dependencies>
<!-- 添加commons-logging依赖 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<!-- 添加junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- 添加spring的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
</dependencies>
导入后保存pom文件
spring-core:Spring的核心工具包
这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 外部依赖Commons-Logging, Log4J。
spring-beans:Spring IOC的基础实现,包含访问配置文件、创建和管理bean等。
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。 外部依赖spring-core,cglib-nodep.jar。
spring-context:在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。
这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。
外部依赖spring-core.jar,spring-beans.jar,spring-aop.jar,commons-collections.jar,aopalliance.jar。
spring-expression:Spring表达式语言
spring-aop:Spring的面向切面编程,提供AOP(面向切面编程)的实现
这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。
外部依赖spring-core.jar,spring-beans.jar,cglib-nodep.jar,aopalliance.jar
附:aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对面向切面的接口。通常Spring等其它具备动态织入功能的框架依赖此包。
cglib-nodep.jar:这个包是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架。cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。 实际上CGlib为spring aop提供了底层的一种实现;为hibernate使用cglib动态生成VO/PO (接口层对象)。
2.3 编写实体类
package com.sldl.pojo;
public class User {
private String username;
public User() {
}
public User(String username) {
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
}
2.4 编写核心配置文件
在src/main/resources目录下 ,创建Spring的核心配置文件, 这里我们命名为beans.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">
</beans>
2.5 配置Bean
在 beans.xml 文件中添加如下配置:将User类作为Bean装配到Spring IoC容器中
<?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">
<!--在spring的配置文件里,注册User类的bean配置,
此时User类的对象就是Spring容器帮助我们创建对象,默认调用无参构造器-->
<bean id="u1" class="com.sldl.pojo.User"></bean>
</beans>
2.6测试
package com.sldl.test;
import com.sldl.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IOCTest {
@Test
public void test1(){
//先获取SpringIOC的容器,因为核心配置文件在resources里,即根目录下,因此直接写文件名即可
ApplicationContext ctx =
new ClassPathXmlApplicationContext("beans.xml");
//使用容器的getBean方法,从容器中获取User类型的对象
User user = (User)ctx.getBean("u1");
//因为SpringIOC容器使用无参构造器创建的对象,因此属性值为null
System.out.println(user);
}
}
运行结果: