基于IntelliJ IDEA的Java EE Web Applicatin 4.0的Spring小例子
1.新建项目
1.1 新建一个Java EE Web Applicatin 4.0的项目
1.2 创建lib文件夹并导入基础包
可选择:
-
spring基础包下载地址(spring framwork的所有包):spring-4.1.9
commons-logging下载 -
最简单Spring程序的包的(建议,本文基于这几个包来实现ioc):点击跳转 提取码:0we8
复制包到lib下
右键导入到项目中
2.添加代码
比如:我想实现三个类:游戏(Game)、电脑(Computer)、玩家(Player)
他们三个之间的关系是:游戏依赖于电脑,电脑依赖于玩家
所以普通程序需要在电脑类
中new一个游戏实例
,玩家类
中new一个电脑实例
,最后在主函数中调用玩家实例方法
就实现了对三个类的控制。这是在每一个类中由程序员自己new出来每一个类需要的对象,耦合度很高。
通过Spring的基础5个包,可以使用Spring最核心的思想——IOC(控制反转)容器
依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入。具体介绍如下。
- 属性 setter 注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。 - 构造方法注入
指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。
下面通过属性 setter 注入的案例演示 Spring 容器是如何实现依赖注入的。具体步骤如下。
2.1 java代码:
玩家类需要一个电脑类的对象,给予setComputer()
//玩家类
public class Player {
private String userName;
//依赖注入
//1.声明依赖关系类
private Computer computer;
//2.提供赋值入口
public void setComputer(Computer computer) {
this.computer = computer;
}
//玩家游玩电脑里的游戏
public void playGame() {
System.out.println("我叫" + userName);
System.out.println(computer.installGame());
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
电脑类需要一个游戏类对象,给予一个setGame()
//电脑模型
public class Computer {
private String kind;
//使用依赖注入,将applicationContext.xml配置中的依赖关系注入到Java代码中
//1.声明所依赖的类,注意,依赖名要与配置文件汇总的依赖名相同
//2.需要提供依赖注入的赋值入口
private Game game;
public void setGame(Game game) {
this.game = game;
}
//使用电脑安装游戏
public String installGame(){
return "我在我的"+kind+"电脑上,安装了"+game.getGameName()+
"这个游戏是"+game.getGameType()+"类型的";
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
}
游戏类(底层类)
//游戏模型
public class Game {
private String gameName;
private String gameType;
public String getGameName() {
return gameName;
}
public void setGameName(String gameName) {
this.gameName = gameName;
}
public String getGameType() {
return gameType;
}
public void setGameType(String gameType) {
this.gameType = gameType;
}
}
Test.java(测试函数)
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//applicationContext.xml的默认加载路径是classpath => src
//当工程启动时,IOC容器读取applicationContext.xml文件,加载配置项,进行实例化
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
//通过beanId获取实例
Player player = (Player)context.getBean("player");
player.playGame();
}
}
2.2 创建Spring配置文件
在src下创建spring config的xml文件,默认名为applicationContext
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">
<!--
通过配置bean来加载实例
当项目工程启动时 applicationContext.xml会被spring的ioc容器扫描所有的配置信息
然后根据配置的beanId,查找对应的class,然后为这个class生产实例,等待使用。
1.以前使用主动依赖的方式的方式在维护程序类之间的关系,耦合度太高,不利于程序扩展
2.现在使用IOC控制翻转的设计思想,将class的实例在工程启动时就生产实例,在业务中需要时
通过直接获取有效的降低了耦合,通过根据不同的业务进行组装搭配,实现另一个松散的耦合关系
-->
<!-- 装配Java类,每个bean就是指一个Java类 -->
<bean id="game" class="com.cheng.spring.Game">
<!-- 为实例的属性赋值 -->
<property name="gameName" value="王者农药"/>
<property name="gameType" value="推塔"/>
</bean>
<bean id="computer" class="com.cheng.spring.Computer">
<!-- 为实例的属性赋值 -->
<property name="kind" value="8848钛合金手机"/>
<!-- 依赖关系注入 ,name是依赖的名字,ref是指具体装配的beanid -->
<property name="game" ref="game"/>
</bean>
<bean id="player" class="com.cheng.spring.Player">
<!-- 为实例的属性赋值 -->
<property name="userName" value="此成非彼诚"/>
<!-- 依赖关系注入 ,name是依赖的名字,ref是指具体装配的beanid -->
<property name="computer" ref="computer"/>
</bean>
</beans>
3.运行Test
右键run Test.main()
通过Spring的IOC容器,在不需要自己去实例化的情况下,完成了对三个类的实例化和控制。
4.总结
在程序执行时,对象的创建并不是通过 new一个类完成的,而是由 Spring 容器管理实现的。这就是 Spring IoC 容器思想的工作机制。
如果对你有所帮助,请点个赞支持一下,谢谢~
下一篇介绍 Spring Bean:Spring学习(4)-Spring Bean的配置、常用属性和注入方法