该系列为imooc Spring从入门到进阶笔记,跟随课程加入自己见解,同时也为项目中碰到一些问题做了解答
大纲
1、Spring的概述
1. 什么是Spring
- Spring 是一个开源框架
- Spring 为简化企业级应用开发而生,使用Spring可以使简单的JavaBean 实现以前只有EJB才能实现的功能
- Spring 是JavaSE/EE的一站式框架
JAVA EE在开发过程中,会将服务器端分为了Web层、业务层、持久层
Spring有每一层的解决方案
web层(SpringMVC)
业务层(Bean管理:IOC/事务管理)
持久层(JDBC模板/和orm整合–hibernate、Mybatis)
2. Spring的优点
-
方便解耦,简化开发:
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。 -
AOP编程的支持:
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。 -
声明式事物的支持:
只需要通过配置就可以完成对事物的管理,而无需手动编程。 -
方便程序的测试:
支持junit4,可以通过注解方便的测试Spring程序。 -
方便继承各种优秀框架:
Spring不排斥各种优秀的开眼框架,其内部提供了对各种优秀框架(hibernate、Mybatis…)的直接支持 -
降低JavaEE API的使用难度:Spring对javaEE开发中非常难用的一些API(JDBC/JavaMail/远程调用等),都提供了封装,是这些API应用难度大大降低。
- Spring的模块
2 、Spring IOC的底层原理实现
-
好的程序设计的原则:
OCP原则:(open-close原则)对程序扩展是open的 ,对修改程序代码是close.
也就是尽量做到不修改程序代码,实现对程序的扩展。 -
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。 -
Spring的IOC底层实现原理:通过工厂模式+反射+配置文件的方式实现,达到解耦的目的。
-
工厂类FactoryBean的作用:代替(封装省去)我们去new对象的过程。
大神写的详细IOC
3、Spring IOC的快速入门案例
3.1、Spring IOC入门案例开发流程
- 下载spring开发包
官方下载Spring 4.x 最新开发版本
Spring 4.2版本目录结构
- 复制spring开发jar包到工程
- 理解IOC控制反转和DI依赖注入
- 编写Spring核心配置文件
- 在程序中读取Spring配置文件,通过Spring框架获得Bean,完成相应操作
3.2、实现Spring IOC入门案例
- 使用idea Maven创建Web项目
- 导入Spring核心开发包到创建好的project中
再集成log4j、junit
在项目pom文件中引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
-
编写代码
在main下新建java文件夹,右键java文件夹
这样就可以在java文件夹下创建包或编写java代码了 -
在java文件夹>新建com.imooc.ioc.demo1包>新建UserService接口
package com.imooc.ioc.demo1;
public interface UserService {
public void sayHello();
}
- 在com.imooc.ioc.demo1包>新建UserServiceImpl类(UserService接口的实现类)
package com.imooc.ioc.demo1;
public class UserServiceImpl implements UserService{
@Override
public void sayHello() {
System.out.println("Hello Spring");
}
}
- 创建Spring配置文件
在main下>新建resources文件夹>新建Spring Config XML文件(Spring配置文件默认命名为applicationContext.xml该名称我们可以自定义)
maven 项目,右键 New --> XML Configuration File 时,无 Spring Config 选项的解决办法
<?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">
<!--UserService的创建权交给Spring -->
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl"></bean>
</beans>
- 在com.imooc.ioc.demo1包>新建SpringDemo1测试类
package com.imooc.ioc.demo1;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringDemo1 {
@Test
//传统方式开发
public void demo1(){
UserService userService=new UserServiceImpl();
userService.sayHello();
}
@Test
//Spring的方式实现
public void demo2(){
//创建Spring的工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类
UserService userService=(UserService) applicationContext.getBean("userService");
userService.sayHello();
}
}
- 运行测试方法
使用传统方式
使用Spring方式
使用Spring方式的小节
- 在resources目录下新建Spring配置文件:applicationContext.xml
- 配置类文件映射:
- 通过ApplicationContext创建类对象
ApplicationContext application = new ClassPathApplicationContext(xml路径);
Object object = applicationContext.getBean(beanId);
4、Spring中的IOC与DI
- IOC:Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架
- DI:Dependency Injection 依赖注入的概念,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进去,DI是依赖于IOC的,也就是说必须先有IOC
演示DI依赖注入
- 修改UserServiceImpl,添加name属性
package com.imooc.ioc.demo1;
public class UserServiceImpl implements UserService{
//添加属性
private String name;
@Override
public void sayHello() {
System.out.println("Hello Spring"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 在SpringDemo1中演示传统方式来设置对象属性,并使用UserServiceImpl类中的sayHello方法
package com.imooc.ioc.demo1;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringDemo1 {
@Test
//传统方式开发
public void demo1(){
//要使用UserServiceImpl的方法,就不能再向上转型,因为UserService中没有name属性
//UserService userService=new UserServiceImpl();
UserServiceImpl userService=new UserServiceImpl();
//设置属性
userService.setName("张三");
userService.sayHello();
//使用传统方式会修改代码,耦合高
}
@Test
//Spring的方式实现
public void demo2(){
//创建Spring的工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类
UserService userService=(UserService) applicationContext.getBean("userService");
userService.sayHello();
}
}
- 演示DI的方式来设置对象属性,并使用UserServiceImpl类中的sayHello方法
修改applicationContext.xml,添加<property name="属性名" value="属性值"/>
<?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">
<!--UserService的创建权交给Spring -->
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl">
<!-- 设置属性 -->
<property name="name" value="李四"/>
</bean>
</beans>
在SpringDemo1中使用Spring DI方式实现,demo2无需做任何修改,启动测试代码demo2
可见程序正常输出