Spring
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
IoC
IoC(Inverse of Control)反转控制,将原本在程序中手动创建业务接口对象的控制权交由Spring框架管理,简单说创建业务接口对象的控制权反转到Spring框架。
DI
DI(Dependency Injection)依赖注入概念,就是在Spring创建对象的过程中为对象所依赖的属性注入到对象中。
AOP
AOP(Aspect Oriented Programming)可以通过预编译方式和运行其动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。
现在主流的编程方式是面向接口编程,在接口与实现类的创建过程会产生不可避免的耦合,例如
UserService us = new UserServiceImpl()
,通过new
方法创建直接将接口与实现类绑定在一起,如果现有两套不同的实现类需要从第一个实现类切换到第二个实现类就需要去修改控制层的代码,所以提出了Spring框架利用工厂类+反射+配置文件来实现接口与实现类的绑定
Spring的优点
- 方便程序测试:Spring支持JUnit4,可以对框架进行测试
- 方便集成各种框架:Spring不排斥各种优秀的开源框架,其内部提供对其他框架的直接支持
- 降低JavaEE API的使用难度:Spring对JavaEE的常用的一些API进行了封装,降低了使用难度
Spring IOC基础搭建
引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
在pom.xml文件中加入依赖文件,导入Spring的核心jar包
创建接口与实现类
我们创建一个简单的例子,并在实现类中加入一个私有属性
package com.spring.test.service;
public interface UserService {
void hello();
}
package com.spring.test.service.impl;
import com.spring.test.service.UserService;
public class UserServiceImpl implements UserService {
private String name;
@Override
public void hello() {
System.out.println("Hello " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
如果还是按照以前的方法使用new
来创建接口对象,实现类中的属性我们就无法对其赋值,所以在Spring中可以使用DI来实现依赖注入
创建Spring的核心配置文件
创建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">
<bean id="userService" class="com.spring.test.service.impl.UserServiceImpl">
<property name="name" value="Mary"/>
</bean>
</beans>
Spring通过<bean>
标签来调用实现类,id为bean
的唯一标识,class指向实现类。
bean
标签下还可以设置property
标签用于向实现类中注入依赖属性
创建测试类实现Spring调用
package com.spring.test;
import com.spring.test.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.hello();
}
}
调用ClassPathXmlApplicationContext
类的构造方法加载Spring的核心配置文件并创建Spring的工厂类ApplicationContext
对象,通过工厂类对象的getBean(String var)
方法就可以直接创建接口类,传入的参数为配置中bean标签的id。
测试结果:
有上述的简单案例可以看出,Spring将接口与实现类完全解耦,完全可以通过修改配置,就能实现实现类的转换,使开发过程更加简便