使用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,官方建议命名为: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[email protected]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)

原文地址:https://www.cnblogs.com/songxingzhu/p/8995758.html

时间: 2024-11-05 13:46:35

使用Spring框架入门一:基于XML配置的IOC/DI的使用的相关文章

【Spring】AOP之基于XML配置总结与案例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.AOP的一些概念 AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但

使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依赖包spring-beans\spring-core\spring-expression\spring-context. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML 定义的 Bean 信息转换为 Spring 框架的 Bean Definition 对象的处理过程,向读者展示了 Spring 框架的奥妙之处,可以加深开发人员对 Spring 框架的理解. 0 评论: 秦 天杰, 软件工程师, IBM China 2013 年 9 月 02 日 内容 在 IBM

基于xml配置的springMVC-快速入门

一:准备工作 将需要用到的spring包放进lib文件夹内,具体需要什么包自己网上查,或在我的例子里找. 二:配置文件:web.xml 主要是配置servlet路径方式和指定上下文xml文件. 1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="

基于XML配置的Spring MVC

1.添加jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation

Spring Security应用开发(02)基于XML配置的用户登录

1.1. 基于XML配置的登录功能 经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式. (1)配置web.xml. 主要是为Spring MVC和Spring Security提供一些入口,以便有机会进行Spring MVC以及Spring Security的初始化和过滤处理等工作. <servlet> <servlet-name>spri

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

Spring IOC的初始化过程——基于XML配置(一)

前言:在面试过程中,Spring IOC的初始化过程,基本上属于必答题,笔者的亲身经历.因此本文基于Spring的源码对其IOC的初始化过程进行总结. 注:spring版本为4.3.0. 1.调试前准备 在spring源码中,添加如下内容(有关spring源码如何导入idea,请查询相关资料): 说明: ①User为简单bean,含有name和gender两个属性. ②User.xml为spring配置文件,仅仅对User进行简单的配置. ③SpringIoCDebug为测试类. 先看执行结果:

MyBatis入门程序(基于XML配置)

创建一个简单的MyBatis入门程序,实现对学生信息的增删改查功能(基于XML配置) 一.新建一个Java工程,导入MyBatis核心jar包.日志相关的jar包以及连接Oracle数据库所需驱动包,目录结构如下 二.创建MyBatis核心配置文件mybatis-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//myba