1.Spring的优点
(1)方便解耦,简化开发。Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。
(2)AOP编程的支持。Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
(3)声明式事务的支持只需要通过配置就可以完成对事务的管理,而无需手动编程。
(4)方便程序的测试。Spring对Junit4支持,可以通过注解方便的测试Spring程序。
(5)方便集成各种优秀框架。Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis等)的直接支持。
(6)降低JavaEE API的使用难度。Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,是这些API应用难度大大降低。
2.Spring的模块
3.Spring IOC的底层实现原理
最初两个类之间互相调用需要实现另一个类的对象。
这样不利于解耦。之后就是面向接口编程。
程序设计需要满足ocp原则,也就是open-close原则,
对程序扩展是open的,对修改程序代码是close,
需要尽量做到不修改程序的源码,实现对程序的扩展。
之前我们使用工厂模式,来实现松耦合,但是单纯的使用工厂模式,并不彻底。
spring通过工厂+反射+配置文件的方式来实现程序的解耦。
比如可以这样实现:
<bean id=“us” class="com.imooc.UserServiceImpl"> class FactoryBean{ public static Object getBean(String id){ 反射 } }
通过传入id,来实例化对应的类对象。
4.Spring快速入门
开发流程:
下载Spring开发包
复制Spring开发jar包到工程
理解IOC控制反转和DI依赖注入
编写Spring核心配置文件
在程序中读取Spring配置文件,通过Spring框架获得Bean,完成相应操作。
1)使用maven构建项目
2)导入项目依赖
spring-core
spring-context
spring-beans
spring-expression
commons-logging
log4j
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.2.8.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>
3)简单实现
(1)传统方法
a.创建接口类
public interface UserService { public void sayHello(); }
b.实例化一个对象
public class UserServiceImpl implements UserService { public void sayHello() { System.out.println("Hello Spring"); } }
c.调用
public void demo1(){ UserService userService = new UserServiceImpl(); userService.sayHello(); }
(2)Spring解决方式
a.创建一个Spring配置文件
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl"></bean>
b.通过id来获取对应的对象
public void demo2(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //创建Spring得工程 UserService userService = (UserService) applicationContext.getBean("userService"); //通过工厂获取类 userService.sayHello(); }
既通过工厂管理类,后面通过ID来找对应的类,如何找到接口下的对应类了,此时我只需要通过类命,然后强转,就可以获得类对象。
这样只需要通过类名,就可以获取类,同时又有接口的约束。
5.IOC和DI的概念
IOC Inverse of Control反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由SPring框架来管理,然后通过工厂来创建就可以了。
DI Dependency Injection依赖注入的概念,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进去。
在Spring中,只需要在配置文件中:
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl">
<!--设置属性-->
<property name="name" value="李四" />
</bean>
然后就可以配置,spring会自动调用set和get方法。然后工厂类及其结构类自然不需要修改。
依赖注入的目的是在代码之外管理程序组件的依赖关系,依赖注入减少了程序组件之间的耦合。