Spring 基础(一)
Spring 基础(一)
Spring 基础笔记系列
框架
开发人员可以在项目开发过程中,引用某些框架,从而,在开发过程中,就可以不必关心某些功能的开发,而是由框架直接完成!
解决的问题
Spring框架主要解决了创建对象和管理对象的问题!
传统的创建对象的方法例如:
User user = new User();
使用Spring框架之后,可以改为:
User user = 从框架中获取;
这样的做法的好处主要在于解耦,即解除耦合度,表现为降低对象与对象之间的依赖关系。
例如,在以下代码中,UserServlet就是依赖于UserDao的,因为功能的实现是通过UserDao中的reg()方法来实现的,如果没有UserDao类,则UserServlet无法完成用户注册功能:
public class UserDao {
public void reg() {
}
}
public class UserServlet {
public UserDao userDao = new UserDao();
public void doPost(...) {
userDao.reg();
}
}
在以上UserServlet的代码中,明确的出现了UserDao的类名,也就是明确的表示了依赖于UserDao这个类,这种明确的依赖关系是不推荐的!万一随着项目的更新、维护等,UserDao这个类中的代码已经不足以满足后续的使用需求,希望通过另一个例如UserDao2这个类来替换它,则原有代码中:
public UserDao userDao = new UserDao();
这样的语句都需要替换为:
public UserDao2 userDao = new UserDao2();
这样的维护方式是非常不便利的!
首先,可以通过接口解决其中一部分问题,例如:
public interface IUserDao {
void reg();
}
然后:
public class UserDao implements IUserDao {}
public class UserDao2 implements IUserDao {}
则在UserServlet中就可以使用接口去声明对象:
public IUserDao userDao = new UserDao();
所以,无论使用哪个类,或者需要更换,以后都不用再调整以上变量的声明部分!
如果希望对象的创建过程也不会体现出UserDao或UserDao2的名称,还可以使用设计模式中工厂模式来解决:
public class UserDaoFactory {
public static IUserDao newInstance() {
return new UserDao2();
}
}
则之前的代码就可以调整为:
public IUserDao userDao = UserDaoFactory.newInstance();
由于以上代码中完全没有出现UserDao或UserDao2的类名,即使后续需要替换这些类,也只需要将新的类也实现IUserDao接口,并修改工厂方法中的返回值,而项目中其它位置的代码是不需要调整的!
public class UserServlet {
public IUserDao userDao = UserDaoFactory.newInstance();
public void doPost(...) {
userDao.reg();
}
}
对于代码中并不出现别的类的名称,却可以正确使用它,则称之为耦合度较低!
在实际开发时,为每种定位的类都创建对应的工厂类是不现实的!所以,就有了Spring框架,可以把Spring框架理解为是一个庞大的工厂,可以创建各种各样的类的对象,在整个项目开发过程中,需要对象时,就找Spring框架去获取对象即可,从而实现解耦的目的,而Spring框架由于可以管理很多对象,所以也被称之为Spring容器。
当然,关于Spring框架,还有其它的特性,例如:IoC、DI、AOP等,将在后续进行讲解。
准备Spring环境
创建Maven Project
,在创建过程中,勾选Create a simple project ...,Artifact Id输入cn.tedu.spring
,Group Id
输入SPRING01
,**
Packaging**选择war
。
在输入项目信息时,Artifact Id应该是即将使用的包中,Group Id应该 能描述项目的特征,Packaging应该根据项目的定位来选择,由于后续使用Java语言开发项目基本上是Web项目,所以可以选择war。
创建好项目后,需要先生成web.xml文件。
然后,在pom.xml文件中添加spring-webmvc依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
其实此次只需要使用spring-context依赖,但是,后续学习到SpringMVC框架开始就必须使用spring-webmvc依赖,而且,spring-webmvc依赖中包含了spring-context依赖,所以,此次也可以直接使用spring-webmvc。
另外,还需要从http://doc.tedu.cn/config/spring-context.zip
下载Spring的配置文件压缩包,解压得到applicationContext.xml文件,将文件复制到项目的src/main/resources下:
通过Spring创建并获取对象-通过无参数构造方法
首先创建cn.tedu.spring.User
类:
public class User {
}
然后,在Spring的配置文件中添加配置:
<bean id="user" class="cn.tedu.spring.User"/>
然后,添加单元测试的依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
可以在src/test/java下创建cn.tedu.spring.Tests
单元测试类,编写单元测试:
public class Tests {
@Test
public void test() {
// 加载Spring配置文件,获取Spring容器
// 从容器中获取所需的对象
// 测试
// 释放资源
}
}
具体实现为:
public class Tests {
@Test
public void test() {
// 加载Spring配置文件,获取Spring容器
ClassPathXmlApplicationContext ac
= new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 从容器中获取所需的对象
User user = (User) ac.getBean("user");
// 测试
System.out.println(user);
// 释放资源
ac.close();
}
}
通过Spring创建并获取对象-通过静态工厂方法(不常用)
如果某个类中有静态的方法,并获取当前类的对象,例如Calendar
类,通过Calendar.getInstance()
即可获取Calendar
类型的对象,则在配置时:
<!-- 通过静态工厂方法 -->
<bean id="cal"
class="java.util.Calendar"
factory-method="getInstance">
</bean>
通过Spring创建并获取对象-通过实例工厂方法(不常用)
表现为某个类无法直接创建对象,但是,却有另一个工厂类,可以先创建工厂类的对象,然后,再创建所需要类的对象,例如:
public class Phone {
public Phone(String name) {
}
}
public class PhoneFactory {
public Phone getInstance() {
return new Phone("XiaoMi");
}
}
然后,在配置时:
<beans>
<!-- 通过实例工厂方法 -->
<bean id="phoneFactory"
class="cn.tedu.spring.PhoneFactory">
</bean>
<bean id="phone"
class="cn.tedu.spring.Phone"
factory-bean="phoneFactory"
factory-method="getInstance">
</bean>
</beans>
可以看到,这种做法就必须先创建工厂类PhoneFactory
的对象,然后调用工厂类的方法getInstance()
,从而完成类的创建。
这种做法还要求工厂类必须有无参数的构造方法!