学前要求: 已学完本系列(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好用的点:
- Alt+Ins 可以自助生成函数
- Ctrl+Alt+V 可以自动生成返回值
- 拼音psvm和sout的自动补全
- 按住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操作,静态工厂的入门级案列
我是哈利巴多先生,如果觉得不错,还望多多鼓励(文章不定时更新)