Spring学习笔记一:工厂模式
1.简介2.工厂模式简单工厂设计通⽤⼯⼚的设计通用工厂的使用方式
1.简介
1.Spring是⼀个轻量级的 JavaEE 解决⽅案,整合众多优秀的设计模式。 2.EJB(Enterprise Java Bean):重量级框架,存在问题包括:运行环境苛刻,代码移植性差。 什么是轻量级?
对于运行环境是没用额外要求
开源 tomcat resion jetty收费 weblogic websphere 代码移植性高
不需要实现额外的接口
JavaEE 的解决方案: 整合设计模式 ⼯⼚,代理,模板,策略
什么是设计模式?
⼴义概念:⾯向对象设计中,解决特定问题的经典代码。狭义概念:GOF4⼈帮定义的23种设计模式:⼯⼚、适配器、装饰器、⻔⾯、代理、模板…】
2.工厂模式
概念:通过⼯⼚类,创建对象;
User user
= new User();
UserDAO userDAO
= new UserDAOImpl();
好处:解耦合 1.耦合:指定是代码间的强关联关系,⼀⽅的改变会影响到另⼀⽅;
问题:不利于代码维护;简单:把接⼝的实现类,硬编码在程序中;
简单工厂设计
package com
.baizhiedu
.basic
;
import java
.io
.IOException
;
import java
.io
.InputStream
;
import java
.util
.Properties
;
public class BeanFactory {
private static Properties env
= new Properties();
static{
try {
InputStream inputStream
= BeanFactory
.class.getResourceAsStream("/applicationContext.properties");
env
.load(inputStream
);
inputStream
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
public static UserService
getUserService() {
UserService userService
= null
;
try {
Class
clazz = Class
.forName(env
.getProperty("userService"));
userService
= (UserService
) clazz
.newInstance();
} catch (ClassNotFoundException e
) {
e
.printStackTrace();
} catch (InstantiationException e
) {
e
.printStackTrace();
} catch (IllegalAccessException e
) {
e
.printStackTrace();
}
return userService
;
}
public static UserDAO
getUserDAO(){
UserDAO userDAO
= null
;
try {
Class
clazz = Class
.forName(env
.getProperty("userDAO"));
userDAO
= (UserDAO
) clazz
.newInstance();
} catch (ClassNotFoundException e
) {
e
.printStackTrace();
} catch (InstantiationException e
) {
e
.printStackTrace();
} catch (IllegalAccessException e
) {
e
.printStackTrace();
}
return userDAO
;
}
}
配置文件 applicationContext.properties:
# Properties 集合 存储 Properties文件的内容
# 特殊Map key=String value=String
# Properties [userService = com.baizhiedu.xxx.UserServiceImpl]
# Properties.getProperty("userService")
userService = com.baizhiedu.basic.UserServiceImpl
userDAO = com.baizhiedu.basic.UserDAOImpl
通⽤⼯⼚的设计
问题:简单⼯⼚会存在⼤量的代码冗余。
package com
.baizhiedu
.basic
;
import java
.io
.IOException
;
import java
.io
.InputStream
;
import java
.util
.Properties
;
public class BeanFactory {
private static Properties env
= new Properties();
static{
try {
InputStream inputStream
= BeanFactory
.class.getResourceAsStream("/applicationContext.properties");
env
.load(inputStream
);
inputStream
.close();
} catch (IOException e
) {
e
.printStackTrace();
}
}
public static Object
getBean(String key
){
Object ret
= null
;
try {
Class
clazz = Class
.forName(env
.getProperty(key
));
ret
= clazz
.newInstance();
} catch (Exception e
) {
e
.printStackTrace();
}
return ret
;
}
}
配置文件 applicationContext.properties:
# Properties 集合 存储 Properties文件的内容
# 特殊Map key=String value=String
# Properties [userService = com.baizhiedu.xxx.UserServiceImpl]
# Properties.getProperty("userService")
userService = com.baizhiedu.basic.UserServiceImpl
userDAO = com.baizhiedu.basic.UserDAOImpl
通用工厂的使用方式
定义类型 (类)通过配置⽂件的配置告知⼯⼚ applicationContext.properties 中 key = value;通过⼯⼚获得类的对象 Object ret = BeanFactory.getBean(“key”);
总结: Spring本质:⼯⼚ ApplicationContext (applicationContext.xml)