SPOC
Srpring 是一种轻量级框架,称作Java EE 的春天,当前的主流框架。
学习目的是使现有技术更加易用,推进编码最佳实践
内容包括:
问题的产生:
面向对象方法设计的软件系统中,其底层实现都是由 N 个对象组成的,所有的对象通过彼此合作,最终实现系统的业务逻辑。但是,系统越庞大,对象关系就越复杂,从而导致系统的耦合度越高,涉及维护就越困难。
解决问题的方法:
IOC,全称 Inversion of Control,即控制反转;DI,全称 Dependency Injection,即依赖注入
AOP,全称 Aspect Oriented Programming,即面向切面编程。
IOC即控制反转,可以把对象比作齿轮,它们之间的关系比作齿轮对象相互协同转动。
IOC主要原理:借助“第三方”实现具有依赖关系的对象之间的解耦。
如图,IOC容器,使得 A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方“了,全部对象的控制权上缴给“第三方” IOC容器,主动创建变为了被动注入,这就是“控制反转” (依赖注入)这个名称的由来。
以传统Web开发为例,DAO层和Service层的交互通常是:
DAO层:
UserDao.java
public interface UserDao{
int add(User user);
}
UserDaoImpl.java
public class UserDaoImpl implements UserDao{
@Override
public int add(User user){
//...JDBC交互
}
}
Service层:
UserService.java
public interface UserService{
int addUser(User user);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService{
UserDao userDao = new UserDaoImpl();
public int addUser(User user){
return userDao.add(user);
}
}
可以发现在UserServiceImpl.java
中声明了DAO层对应的接口,并通过多态的方式声明了接口实现类的实例。不过 UserDao userDao = new UserDaoImple()
这一句已经固定,IOC的容器就是将指定的类作为Bean
注入给userDao
,而不需要在代码里面进行实例化,比如:
public class UserServiceImpl implements UserService{
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public int addUser(User user){
return userDao.add(user);
}
}
通过这种方式以后,并不能直接通过 new UserServiceImpl()
使用业务层的逻辑代码,而需要通过Spring提供的对象来获取到Bean
(即IOC容器里存储的对象)。
实现依赖注入通常有两种方式,注解和XML配置,笔者这里先进行XML配置的学习。
接下来通过一个需求的实现来体验IOC/DI容器的作用。
需求:定义一个实体类表示人类,使用MVC架构设计并通过依赖注入的方式实现调用对象的方法。
Maven项目的依赖:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.unigroupId>
<artifactId>MyBatisFastUseartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
dependency>
<dependency>
<groupId>