1、全局实例
全局实例:Global Instance
一直存在的、不会被GC回收销毁的对象
一般使用public static来创建一个全局实例
演示一下:
1、创建全局实例
public static Car car = new Car();
2、访问全局实例
AfGlobals.car.run();
在任何时候都可以访问,在任何地点都可以访问
代码演示(方便理解记忆)(1.0)
3个普通类:
public class Car
{
public void run()
{
System.out.println("汽车....");
}
}
public class Plane
{
public void fly()
{
System.out.println("飞机飞....");
}
}
public class Train
{
public void speed()
{
System.out.println("火车....");
}
}
全局对象类:
public class AfGlobal
{
public static Car car = new Car();
public static Plane plane = new Plane();
public static Train train = new Train();
}
测试类:
public class Test
{
public static void main(String[] args)
{
AfGlobal.car.run();
AfGlobal.plane.fly();
AfGlobal.train.speed();
}
}
2、全局实例管理
AfGlobals,负责全局实例的管理
项目里所需要的全局实例,都交给它创建和管理
继续看代码(升级) (1.1)
将所有的实例放到一个Map中,当需要实例的时候,初始化执行一次,然后通过get直接获取value
- 在AfGlobals创建所有全局实例,放在map中
- 每个全局实例关联一个唯一的名字
- 在使用的时候,按名字取出
实例管理类:
public class AfGlobal
{
public static Map<String, Object>map = new HashMap<>(); //用来存储实例
/**
* 初始化操作
*/
public static void init()
{
Car car = new Car();
map.put("car", car);
Plane plane = new Plane();
map.put("plane", plane);
Train train = new Train();
map.put("train", train);
}
/**
*
* @param key
* @return 返回对应于key的对象
*/
public static Object get(String key)
{
return map.get(key);
}
}
测试类:
public class Test
{
public static void main(String[] args)
{
//初始化所有全局实例的容器
AfGlobal.init();
//访问全局对象
Car car = (Car)AfGlobal.get("car");
car.run();
System.out.println("exit");
}
}
细节:AfGlobals.map是全局实例,一直存在、不会销毁,所以此map里存储的对象都成了全局实例
3、全局实例框架
框架,就是对相似的流程进行统一化处理
每个全局实例的创建、初始化和访问流程,都是类似的
代码再升级(2.0)
1、添加af-global.xml配置文件
2、由AfGlobal框架自动完成全局实例的创建 loadConfig()
3、当需要访问时,从AfGlobals取得全局实例的引用 obj = afGlobal.get(name)
将类名字存放到xml文件中,利用对xml的操作来进行处理
全局框架类:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import my.Car;
import my.Plane;
import my.Train;
public class AfGlobal
{
public static Map<String, Object>map = new HashMap<>(); //用来存储实例
//静态代码快,首次访问该类时,将运行代码块,且只执行一次
static
{
try {
loadConfig();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化操作
* @throws Exception
*/
public static void loadConfig() throws Exception
{
InputStream inputStream = AfGlobal.class.getResourceAsStream("/af-global.xml");
if(inputStream == null)
throw new Exception("找不到指定文件");
//加载xml
SAXReader reader = new SAXReader();
Document doc = reader.read(inputStream);
Element root = doc.getRootElement();
List<Element> serviceList = root.elements("global");
for(Element e : serviceList)
{
String name = e.attributeValue("name").trim();
String clazz = e.attributeValue("class").trim();
//创建实例,存入map
try
{
Class cls = Class.forName(clazz);
Object obj = cls.newInstance();
map.put(name, obj);
}catch(Exception ex)
{
System.out.println("无法加载 : " + clazz + " : " + ex.getMessage());
}
}
}
/**
*
* @param key
* @return 返回对应于key的对象
*/
public static Object get(String key)
{
return map.get(key);
}
}
配置文件(放在src目录下):
<?xml version="1.0" encoding="UTF-8"?>
<config>
<global name="car" class="my.Car"></global>
<global name="train" class="my.Train"></global>
<global name="plane" class="my.Plane"></global>
</config>
测试类:
import af.global.AfGlobal;
public class Test
{
public static void main(String[] args)
{
//访问全局对象
Car car = (Car)AfGlobal.get("car");
car.run();
System.out.println("exit");
}
}
4、框架的打包
框架,执行的是统一化的处理流程,所以框架一般是通用的
因此,可以将AfGlobal打包成jar文件
5、框架的优化 (1)
考虑:全局实例在创建之后,可能需要进一步的优化
比如:
使用汽车之前,先给汽车加点油
所以:在框架里应该允许添加一个实例的初始化方法
1、修改af-global.xml
<global name="car" class="my.Car" init="getReady"></global>
2、修改AfGlobal.loadConfig()
在创建实例之后,紧接着调用它的初始化方法
public class Car
{
public void run()
{
System.out.println("汽车....");
}
public void getReady()
{
System.out.println("加油~~~~~");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<config>
<global name="car" class="my.Car" init="getReady"></global>
<global name="train" class="my.Train"></global>
<global name="plane" class="my.Plane"></global>
</config>
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import my.Car;
import my.Plane;
import my.Train;
public class AfGlobal
{
public static Map<String, Object>map = new HashMap<>(); //用来存储实例
//静态代码快,首次访问该类时,将运行代码块,且只执行一次
static
{
try {
loadConfig();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化操作
* @throws Exception
*/
public static void loadConfig() throws Exception
{
InputStream inputStream = AfGlobal.class.getResourceAsStream("/af-global.xml");
if(inputStream == null)
throw new Exception("找不到指定文件");
//加载xml
SAXReader reader = new SAXReader();
Document doc = reader.read(inputStream);
Element root = doc.getRootElement();
List<Element> serviceList = root.elements("global");
for(Element e : serviceList)
{
String name = e.attributeValue("name").trim();
String clazz = e.attributeValue("class").trim();
String init = e.attributeValue("init");
//创建实例,存入map
try
{
Class cls = Class.forName(clazz);
Object obj = cls.newInstance();
if(init != null)
{
Method method = cls.getDeclaredMethod(init);
method.invoke(obj);
}
map.put(name, obj);
}catch(Exception ex)
{
System.out.println("无法加载 : " + clazz + " : " + ex.getMessage());
}
}
}
/**
*
* @param key
* @return 返回对应于key的对象
*/
public static Object get(String key)
{
return map.get(key);
}
}
5、框架的优化 (2)
泛型的返回值 ,解决下图问题
public static <T>T get(String key)
{
return (T)map.get(key);
}