使用Spring框架入门一:基于XML配置的IOC/DI的使用
一、Spring框架
1、方法一:逐项导入基础依赖包:
spring-core、spring-beans、spring-context、spring-expression
2、方法二:最简洁的导入,直接导入spring-context包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
在pom.xml中加入上spring-context的依赖,它便会自动导入上述四个包。
3、参考本项目结构图:

二、操作案例
1、建立几个类对象,便于测试。
package test1; import lombok.Data; @Data
public class User { private String name;
private int age; public void add() {
System.out.println("user add method executed.");
} }
注意,此类中,使用了lombok框架的@Data方式来实现的Getter和Setter和无参构造函数。引入lombok的方法是添加下列依赖,并为Idea安装一个lombok的插件,并启动注释的编译:
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>


2、建立一个非静态的工厂类,用于测试非静态工厂方式创建Bean。
package test1;
public class UserFactory {
public User createUser() {
User user = new User();
user.setAge(12);
user.setName("张三");
return user;
}
}
3、再创建一个的工厂类,添加一个静态方法,用于测试静态方法创建Bean。
package test1;
public class UserStaticFactory {
public static User createUser() {
User user = new User();
user.setAge(22);
user.setName("张五");
return user;
}
}
4、再建立一个Student类,用来测试多种不同构造函数的情况:
package test1; import lombok.Data; import java.util.List;
import java.util.Map; @Data
public class Student {
private final String name;
private final int age;
private List<User> users;
private User user;
private Map<String, String> map; public Student(String name, int age) {
this.name = name;
this.age = age;
} public Student(User user) {
this.user = user;
this.name = "另外一个有参数构建Name1";
this.age = 2;
} public Student(List<User> users) {
this.users = users;
this.name = "另外一个有参数构建Name2";
this.age = 33;
} public Student(Map<String, String> map) {
this.map = map;
this.name = "另外一个有参数构建Name2";
this.age = 33;
}
}
5、在Maven项目的resources中添加一个xml(在WEB项目中要放在/WEB-INF/下),官方建议命名为:applicationContext.xml,我们为了方便做多项测试,因此就故意起个别的名字,比如:applicationContextTest1.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 id="myUser1" class="test1.User">
<property name="name" value="songxingzhu"/>
<property name="age" value="10"/>
</bean> <!--方式二:非静态工厂创建-->
<bean id="userFactory" class="test1.UserFactory"/>
<!--使用scope设置为prototype(默认为singleton)让每次产生新实例-->
<bean id="myUser2" factory-bean="userFactory" factory-method="createUser" scope="prototype">
<property name="name" value="修改后的Name"/>
</bean> <!--方式三:静态方法创建-->
<bean id="myUser3" class="test1.UserStaticFactory" factory-method="createUser"></bean> <!--构建函数的情况一:普通参数 -->
<bean id="myStudent1" class="test1.Student">
<constructor-arg name="name" value="Sindrol"/>
<constructor-arg name="age" value="23"/>
</bean>
<!--构建函数的情况二:Bean -->
<bean id="myStudent2" class="test1.Student">
<constructor-arg name="user" type="test1.User" ref="myUser3"/>
</bean>
<!--构建函数的情况三:Map -->
<bean id="myStudent3" class="test1.Student">
<constructor-arg name="map">
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="key1" value="value1"/>
<entry key="key2" value="value2"/>
</map>
</constructor-arg>
</bean>
<!--构建函数的情况四:List -->
<bean id="myStudent4" class="test1.Student">
<constructor-arg name="users">
<array>
<ref bean="myUser1"/>
<ref bean="myUser2"/>
</array>
</constructor-arg>
</bean>
</beans>
6、调用Spring框架
(1)调用代码:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test1.Student;
import test1.User; public class BeanTest {
@Test
public void test1() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest1.xml");
User myUser1 = (User) context.getBean("myUser1");
System.out.println(myUser1);
User myUser2 = (User) context.getBean("myUser2");
System.out.println(myUser2);
User myUser2_2 = (User) context.getBean("myUser2");
System.out.println("[user2==myUser2_2]:" + (myUser2 == myUser2_2));
User myUser3 = (User) context.getBean("myUser3");
System.out.println(myUser3); Student student1 = (Student) context.getBean("myStudent1");
System.out.println(student1);
Student student2 = (Student) context.getBean("myStudent2");
System.out.println(student2);
Student student3 = (Student) context.getBean("myStudent3");
System.out.println(student3);
Student myStudent4 = (Student) context.getBean("myStudent4");
System.out.println(myStudent4); }
}
(2)测试结果:
"C:\Program Files\Java\jdk1.8.0_161\bin\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=9042:D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar;D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\plugins\junit\lib\junit-rt.jar;D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\Projects\JavaProjects\StudyDemo\SpringDemo\target\test-classes;C:\Users\Sindrol\.m2\repository\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Sindrol\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Sindrol\.m2\repository\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 BeanTest,test1
五月 05, 2018 7:47:45 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@22a71081: startup date [Sat May 05 19:47:45 CST 2018]; root of context hierarchy
五月 05, 2018 7:47:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContextTest1.xml]
User(name=songxingzhu, age=10)
User(name=修改后的Name, age=12)
[user2==myUser2_2]:false
User(name=张五, age=22)
Student(name=Sindrol, age=23, users=null, user=null, map=null)
Student(name=另外一个有参数构建Name1, age=2, users=null, user=User(name=张五, age=22), map=null)
Student(name=另外一个有参数构建Name2, age=33, users=null, user=null, map={key1=value1, key2=value2})
Student(name=另外一个有参数构建Name2, age=33, users=[User(name=songxingzhu, age=10), User(name=修改后的Name, age=12)], user=null, map=null)

使用Spring框架入门一:基于XML配置的IOC/DI的使用的更多相关文章
- Spring框架入门之基于xml文件配置bean详解
关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...
- Spring框架入门之基于Java注解配置bean
Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...
- 使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用
一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依 ...
- Spring依赖注入:基于xml配置
基础接口 BeanFactory.ApplicationContext. BeanFactory用于创建并管理.获取各种类的对象. ApplicationContext从BeanFactory派生而来 ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- 【Spring Framework】Spring入门教程(二)基于xml配置对象容器
基于xml配置对象容器--xml 标签说明 alias标签 作用:为已配置的bean设置别名 --applicationContext.xml配置文件 <?xml version="1 ...
- Unit03: Spring Web MVC简介 、 基于XML配置的MVC应用 、 基于注解配置的MVC应用
Unit03: Spring Web MVC简介 . 基于XML配置的MVC应用 . 基于注解配置的MVC应用 springmvc (1)springmvc是什么? 是一个mvc框架,用来简化基于mv ...
- 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP
上节我们提到了使用基于注解实现的AOP,这节我们将用基于xml配置的方式来实现的AOP. 1.首先建立一个类,作为切面类,这个类主要用来实现注解中各种通知要实现的方法. package com.yan ...
随机推荐
- EBS已安装模块
/* Formatted on 2018/3/15 11:14:51 (QP5 v5.256.13226.35538) */ SELECT fa.application_short_name , fp ...
- Cocos2d-x开源、跨平台的游戏引擎
from://http://blog.linguofeng.com/pages/language/c/Cocos2dx.html Cocos2d-x 开源.跨平台的游戏引擎 一.下载 http://c ...
- 为什么用freemarker视图?
在java领域,表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术优点:1.功能强大,可以写java代码2.支持jsp标签(jsp tag)3.支持表达式 ...
- 解决javamail ssl 测试unable to find valid certification path to requested target
运行 java InstallCert smtp.interdrp.com:465 得到jssecacerts文件后复制到jdk1.6.0_14\jre\lib\security目录 然后再发送邮件就 ...
- 转: Linux --- Supervisor的作用与配置
supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中 ...
- ExtJS 教程目录
今天我创建了一个小组,取名ExtJS互助团,欢迎朋友们加入!遇到问题需要帮助的时候别忘了ExtJS互助团!希望更多的园友加入进来,帮别人,也是帮自己!组内讨论不限于ExtJS,还包括FineUI.Ex ...
- .NET零基础入门之02:源码控制管理器的使用
一:概述 源码控制管理器,也叫"版本控制"软件,用于存储.追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是专业软件公司的基础工具.它主要是协助在多人团队中控制代码,防 ...
- Java命令学习系列(四)——jstat
jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...
- String、StringBuffer与StringBuilder之间区别(转)
原文链接:String.StringBuffer与StringBuilder之间区别 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,Stri ...
- boost并发编程boost::atomic
三个用于并发编程的组件: atomic,thread,asio(用于同步和异步io操作) atomic atomic,封装了不同计算机硬件的底层操作原语,提供了跨平台的原子操作功能,解决并发竞争读 ...