跳至主要內容

Spring 基础(一)

Yaien Blog原创大约 5 分钟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.springGroup 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(),从而完成类的创建。

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

上次编辑于:
贡献者: yanggl