Spring入门系列 小白跟着一起学 (2)

学前要求: 已学完本系列(1)

系列(1)我们已经做完了一个小案例,下面我们再将目光看向下面的案列,看看有什么不同

1. 创建文件
文件格式
图片中的4处框圈中的位置是本次demo的改动新增之处
现在开始逐个讲解其中的代码内容(按照逻辑,而非从上往下)
2.Test3Demo中代码

package com.javala.service.interfacela;

/**
 * @author ***
 * */
public interface Test3Demo {
    // 该接口服务于TestDemo3
    void say();
}

3.TestDemo3中代码

package com.javala.service;

import com.javala.service.interfacela.Test3Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import java.util.*;

/**
* @author ***
* */
public class TestDemo3 implements Test3Demo {
    // 这里加上一些数据的定义 体会一下配置文件设置值的大小
    // 这里所有的值都没有在此处初始化 但是在配置文件中写的清清楚楚
    private int[] array;
    private List<String> list;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
    private String name;

    public int[] getArray() {
        return array;
    }

    public void setArray(int[] array) {
        this.array = array;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Set<String> getSet() {
        return set;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void say() {
        // 输出上面的6个数据
        System.out.println("遍历:array:"+ Arrays.toString(array));
        System.out.println("遍历:list:"+list);
        System.out.println("遍历:set:"+set);
        System.out.println("遍历:map:"+map);
        System.out.println("遍历properties:"+properties);
        System.out.println("name值:"+name);

        // 输出
        System.out.println("nothing to say~");
    }
}

说几点idea好用的点:

  1. Alt+Ins 可以自助生成函数
  2. Ctrl+Alt+V 可以自动生成返回值
  3. 拼音psvm和sout的自动补全
  4. 按住Alt+鼠标左键可以选中多行

3.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="test3Demo" class="com.javala.service.TestDemo3">
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>王一</value>
                <value>刘二</value>
                <value>李三</value>
            </list>
        </property>

        <property name="set">
            <set>
                <value>王二</value>
                <value>六三</value>
                <value>李四</value>
            </set>
        </property>

        <property name="map">
            <map>
                <entry key="中国" value="北京"/>
                <entry key="美国" value="纽约"/>
                <entry key="英国" value="伦敦"/>
            </map>
        </property>

        <property name="properties">
            <props>
                <prop key="中国">北京</prop>
                <prop key="美国">纽约</prop>
                <prop key="英国">伦敦</prop>
            </props>
        </property>

        <property name="name" value="姓名"/>
    </bean>
</beans>

4.App1.java

package com.javala.dosomething;App

import com.javala.service.interfacela.Test3Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
* @author ***
* */
public class App1 {
    public static void main(String[] args) {
        // 方式二、文件系统下查找
        ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\java框架\\SSM\\Spring-demo-first\\src\\main\\resources\\applicationContext.xml");

        Test3Demo test3Demo = (Test3Demo) ctx.getBean("test3Demo");

        test3Demo.say();
    }
}

到这就已经讲完了4个文件的组成,但是若想在您自己电脑上运行的话还是不行,因为得需要搞明白我一开头就提及的不同

读者可以自行思考,然后再对比以下answer

1.此次增加了接口类,然后实现接口的思想,最后是Spring容器根据配置创建该接口(Test3Demo)的某个实现类
2.增加了property去初始化数据
3.采用的不再是ClassPathXmlApplicationContext而是FileSystemXmlApplicationContext

公布答案

TestDemo3 test3Demo = (TestDemo3) ctx.getBean("test3Demo"); // 就是这一行代码的修改

下面的可以

Test3Demo test3Demo = (Test3Demo) ctx.getBean("test3Demo"); // getBean的test3Demo可以修改为test3Demo1(别名)

外说一些实际中极大可能使用的功能

给bean起上别名

<!-- 拿id为formName为例,id本唯一,但经过下面代码后,也可以使用toName去使用 -->
<alias name="fromName" alias="toName"/>

完善一个系列(1)中没有提及到的知识点:
Spring的配置方式主要有两种:基于XML的配置和注解(annotation)配置。

而我们现在将的那些在applicationContext.xml中写的叫做XML的配置,后面再设计注解配置

默认Spring容器中所有bean都是单例的(即每次获取的同一类的实例是不会重新创建新的实例的)
而如果需求要求,可以加上scope = "prototype"将该bean设置为多例

静态工厂

静态工厂是通过一个静态方法创建bean实例的方式。这里所谓的"静态工厂"通常是指一个含有静态方法的Java类,在该静态方法内部实现了bean对象的创建过程。

虽然此法近些年使用的较少了,但是必须得知道,万一以后你看的是老代码呢

首先创建一个工厂类:

package com.javala.factory;

import com.javala.service.TestDemo3;
import com.javala.service.interfacela.Test3Demo;


/**
* @author ***
* */
public class UserServiceFactory{
    public static Test3Demo getTest3Demo(){ // 记住此法,是生成对象所用 
        return new TestDemo3();
    }
}

然后便是在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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <!--  使用静态工厂实例化bean  -->
    <!-- factory-method: 便是指定创建对象所用方法   -->
    <!-- 注意此处class是指定工厂的,但不是去创建工厂的对象,后面还个factory-method -->
    <bean id="test3Demo2" class="com.javala.factory.UserServiceFactory" factory-method="getTest3Demo"/>

</beans>

使用实例

package com.javala.dosomething;

import com.javala.factory.UserServiceFactory;
import com.javala.service.interfacela.Test3Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author ***
 * 作用: 使用静态工厂
* */
public class App2 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        Test3Demo test3Demo = (Test3Demo) ctx.getBean("test3Demo2");
        test3Demo.say();
    }
}

总结

那么学到这我们就已经掌握了接口实现的spring操作,静态工厂的入门级案列

我是哈利巴多先生,如果觉得不错,还望多多鼓励(文章不定时更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值