1、Spring介绍
2、Spring的作用
Spring是一个非常活跃的开源框架, 基于IOC和AOP来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系。它的主要目地是简化企业开发。
3、Spring的意义
方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理。
- AOP 编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
- 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程。
- 方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序。
- 方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持。
- 降低 JavaEE API 的使用难度:Spring对 JavaEE 开发中非常难用的API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低。
4、常见的业务层调用数据访问层以实现持久化操作
UserDao接口和UserDaoImpl实现类
package com.fan.dao;
public interface UserDao {
public void show();
}
package com.fan.dao.Impl;
import com.fan.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void show() {
System.out.println("这是UserDao里面的show方法");
}
}
UserService接口和UserServiceImpl实现类
package com.fan.service;
public interface UserService {
public void show();
}
package com.fan.service.Impl;
import com.fan.dao.Impl.UserDaoImpl;
import com.fan.dao.UserDao;
import com.fan.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();//多态?
public void show() {
System.out.println("这是UserService里面的show方法");
userDao.show();
}
}
UserServlet实现类
package com.fan.servlet;
import com.fan.service.Impl.UserServiceImpl;
import com.fan.service.UserService;
public class UserServlet {
private UserService userService=new UserServiceImpl();
public void show(){
System.out.println("这是UserServlet里面的show方法");
userService.show();
}
}
测试类
import com.fan.servlet.UserServlet;
public class Test1 {
public static void main(String[] args) {
UserServlet userServlet=new UserServlet();
userServlet.show();
}
}
测试结果如下:
测试结果
如上代码所示,UserServlet对UserServiceImpl存在依赖关系,UserServiceImpl对UserDaoImpl存在依赖关系。这样的代码很常见,但是存在一个严重的问题,即UserServlet和UserServiceImpl高度耦合,UserServiceImpl和UserDaoImpl高度耦合,如果因为需求变化需要替换UserDao的实现类,将会导致UserServiceImpl中的代码随机发生改变,依次类推。如此,程序将不具备优良的可扩展性和可维护性,甚至在开发中难以测试。
5、Spring中的IOC概念
IOC是 Inverse of Control 的简写,意思是控制反转,是降低对象之间的耦合关系的设计思想。
DI是Dependency Injection的缩写,意思是依赖注入, 是创建对象实例时,为这个对象注入它所依赖的属性。
6、实现过程:
6.1、添加Spring所需的jar包
<!-- Spring的核心工具包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!--在基础IOC功能上提供扩展服务,还提供许多企业级服务的支持,有邮件服务、任务调度、远程访问、缓存以及多种视图层框架的支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring IOC的基础实现,包含访问配置文件、创建和管理bean等 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring context的扩展支持,用于MVC方面 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring表达式语言 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
6.2、创建配置文件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">
</beans>
6.3、在配置文件中创建需要的对象
<bean id="对象名" class="类的完整路径">
<property name="属性名" ref="对象的id值"></property>
</bean>
6.4、加载配置文件,获取对象
ApplicationContext app= new ClassPathXmlApplicationContext("applicationContext.xml");
UserServlet userServlet =(UserServlet)applicationContext.getBean("servlet");
7、利用Spring中 控制反转 和 依赖注入 解决上述问题
7.1添加Spring所需的jar包
7.2创建配置文件applicationContext.xml
7.3UserDao接口和UserDaoImpl实现类
package com.fan.dao;
public interface UserDao {
public void show();
}
package com.fan.dao.Impl;
import com.fan.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void show() {
System.out.println("这是UserDao里面的show方法");
}
}
7.4、UserService接口和UserServiceImpl实现类
package com.fan.service;
public interface UserService {
public void show();
}
package com.fan.service.Impl;
import com.fan.dao.UserDao;
import com.fan.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void show() {
System.out.println("这是UserService里面的show方法");
userDao.show();
}
}
7.5、UserServlet实现类
package com.fan.servlet;
import com.fan.service.UserService;
public class UserServlet {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void show(){
System.out.println("这是UserServlet里面的show方法");
userService.show();
}
}
7.6、在配置文件applicationContext.xml中创建对象
<!--使用bean标签创建对象:id属性="对象名" class属性="类的完整路径"
等价于: UserDaoImpl dao=new UserDaoImpl()
将对象再返回给java代码,使用DI,property标签会调用name属性中制定属性的set方法
<bean>相当于IOC <property>相当于DI
-->
<bean id="dao" class="com.fan.dao.Impl.UserDaoImpl"></bean><!--创建对象-->
<bean id="service" class="com.fan.service.Impl.UserServiceImpl">
<property name="userDao" ref="dao"></property><!--通过set方法赋值,所以UserServiceImpl类中需要有一个setUserDao方法-->
</bean>
<bean id="servlet" class="com.fan.servlet.UserServlet">
<property name="userService" ref="service"></property><!--通过set方法赋值,所以UserServlet类中需要有一个setUserService方法-->
</bean>
7.7、创建测试类
import com.fan.servlet.UserServlet;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1_1 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserServlet userServlet =(UserServlet)applicationContext.getBean("servlet");
userServlet.show();
System.out.println(userServlet);
}
}
测试结果如下:
测试结果
网友评论