使用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 ...
随机推荐
- com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 解决
ERROR - No operations allowed after connection closed. 2011-12-07 11:36:09 - ERROR - query failed or ...
- Javascrip获取页面URL信息
使用Javascript可以方便获得页面的参数信息,常用的几种如下: 设置或获取对象指定的文件名或路径 window.location.pathname 设置或获取整个 URL 为字符串 wind ...
- 让Java和JavaScript进行交互
本篇博文参考自:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/ 我们在使 ...
- COPY ORCHARD GET 404: System.UnauthorizedAccessException: mappings.bin的访问被拒绝
COPY ORCHARD 得到 404 错误,结果翻看Logs,得到的错误是: 014-07-31 17:36:46,217 [16] Orchard.Environment.DefaultOrcha ...
- SVG.js 元素操作整理(二)-Transform
一.transform()获取或设置矩阵变换 var draw = SVG('svg1').size(300, 300); //Transforming SVG元素矩阵变换 var rect = dr ...
- cannot import name 'main' 解决方案
error description: pip3 install numpy Traceback (most recent call last): File "/usr/bin/pip3&qu ...
- SQL Script for select data from ebs and make a csv file to FTP
DECLARE CURSOR cur_lcy_test IS SELECT rcta.customer_trx_id, rcta.trx_number, rcta.trx_date FROM ra_c ...
- SVN服务器搭建和使用(转)
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...
- SQL操作查漏补缺
SQL教程地址:http://www.w3school.com.cn/sql/index.asp TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是 ...
- 使用checkstyle来规范你的项目
Checkstyle是什么 自从做了程序员,关于格式化的讨论就不曾中断过,到底什么才是正确的,什么才是错误的,到现在也没有完整的定论.但随着时间发展,渐渐衍生出一套规范出来.没有什么绝对的正确和错误, ...