Spring框架-准备

本文介绍了Spring框架,它主要解决创建和管理对象问题,能实现解耦。还讲解了在eclipse中准备Spring环境的步骤,包括项目创建、添加依赖、配置文件等。此外,阐述了通过无参数构造方法、静态工厂方法、实例工厂方法,利用Spring创建并获取对象的具体方式。

1. Spring框架

1.1. 框架

框架:开发人员可以在项目开发过程中,引用某些框架,从而,在开发过程中,就可以不必关心某些功能的开发,而是由框架直接完成!

1.2. 解决的问题

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等,将在后续进行讲解。

1.3. 准备Spring环境(eclipse)

创建Maven Project,在创建过程中,勾选Create a simple project …Artifact Id输入cn.tedu.springGroup Id输入SPRING01Packaging选择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下:

1.4. 通过Spring创建并获取对象-通过无参数构造方法

首先创建cn.tedu.spring.User类:

public class User {
}

然后,在Spring的配置文件中添加配置:

<bean id="user" class="cn.tedu.spring.User">
</bean>

然后,添加单元测试的依赖:

<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();
	}

}
1.5. 通过Spring创建并获取对象-通过静态工厂方法(不常用)

如果某个类中有静态的方法,并获取当前类的对象,例如Calendar类,通过Calendar.getInstance()即可获取Calendar类型的对象,则在配置时:

<!-- 通过静态工厂方法 -->
<bean id="cal"
	class="java.util.Calendar"
	factory-method="getInstance">
</bean>
1.6. 通过Spring创建并获取对象-通过实例工厂方法(不常用)

表现为某个类无法直接创建对象,但是,却有另一个工厂类,可以先创建工厂类的对象,然后,再创建所需要类的对象,例如:

public class Phone {
	public Phone(String name) {
	}
}

public class PhoneFactory {
	
	public Phone getInstance() {
		return new Phone("XiaoMi");
	}

}

然后,在配置时:

<!-- 通过实例工厂方法 -->
<bean id="phoneFactory" 
	class="cn.tedu.spring.PhoneFactory">
</bean>
<bean id="phone" 
	class="cn.tedu.spring.Phone"
	factory-bean="phoneFactory"
	factory-method="getInstance">
</bean>

可以看到,这种做法就必须先创建工厂类PhoneFactory的对象,然后调用工厂类的方法getInstance(),从而完成类的创建。

这种做法还要求工厂类必须有无参数的构造方法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值