Spring框架的概述
1.什么是Spring
Spring框架是一个轻量级的开源的Java开发框架,是为了解决企业应用开发的复杂性而创建的。可以在JavaSE和JavaEE中使用,整合了众多优秀的设计模式。
轻量:
- spring框架所引用的jar包比较少,而且 体积小,而且可以独立使用
- 对于运行环境没有额外要求,可以运行在开源的tomact服务器种,也可以运行在收费的weblogic,websphere
- 代码移植性高,不需要实现额外的接口
- 开源:免费
整合设计模式
- 工厂设计模式
- 代理设计模式
- 模板设计模式
- 策略设计模式
- ...
Spring核心技术:
- IOC(控制反转),把创建对象过程交给 Spring 进行管理
- AOP(面向切面编程),不修改源代码进行功能增强
Spring又叫做容器,Spring作为容器,装的是Java对象,可以让Spring创建Java对象,给属性赋值
Spring的作用:实现解耦合,解决Java对象之间的耦合,解决模块之间的耦合。
既然这里说到了解耦合,那么我们肯定要知道耦合是什么意思。以我们写的代码来作为例子,耦合说的就是我们写的代码之间的关系性太高了,互相依赖,牵一发而动全身。接下来我通过代码来说明一下。
public class A{
public int i;
}
public class B{
public void add(A a){
System.out.println(a.i);
}
}
我们可以发现B的代码依赖于A,如果A的代码发生改变,B的代码也会出现变化,我们应该尽量避免这样的情况发生,像我们之前在JavaSE所学到的接口,多态等都可以实现解耦合,我们写代码尽量让模块之间的关联少一点,不然可能一个模块出现错误,我们修改代码以后,导致其他的模块也要修改,这样就很繁琐了。
Spring 特点
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度
Spring框架的官网https://spring.io/
2.什么是设计模式
广义概念
-
- 面向对象设计中,解决特定问题的经典代码
狭义概念
- GOF4人帮定义的23种设计模式
3.工厂设计模式
3.1什么是工厂设计模式
工厂设计模式简单来说就是通过工厂类来创建对象
我们先来看看以前我们怎么创建对象的
User user=new User();
Student student = new Student();
我们以前都是通过new来创建对象,但是工厂设计模式不建议我们用new的方式来创建对象,而是希望我们通过工厂类来创建对象。
这就涉及到工厂的好处:解耦合
刚刚在上面已经说过耦合了,这里我就简单回顾一下
我们来看看耦合的概念
- 耦合:指的是代码之间的强关联关系,一方的改变会影响另一方
- 耦合带来的问题:不利于代码维护
耦合我们可以简单理解,把接口的实现类,硬编码在程序中
- 比如 Dao dao = new DaoImpl();
- 通过工厂类我们可以实现解耦合
3.2简单工厂的设计
package com.zyh.basic;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**工厂类
* @author zengyihong
* @create 2022--04--14 0:15
*/
public class BeanFactory {
private static Properties properties=new Properties();
static {
第一步获得IO输入流
InputStream inputStream = BeanFactory.class.getResourceAsStream("/UserService.properties");
第二步 文件内容 封装到配置文件中
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream !=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static UserService getUserService(){
UserService userService=null;
try {
Class clazz=Class.forName(properties.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(properties.getProperty("userDao"));
userDao = (UserDao)clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return userDao;
}
}
3.3通用工厂的设计
我们可以看得出来,我们以后如果想要对一个类进行解耦合,就应该在工厂类中写相应的工厂方法,想要获得A类,就应该写getA方法
接下来我们就来想想要怎么才可以设计出一个通用的工厂类
我们想要写一个通用的方法来返回所有的类型,所以方法类型应该是Object,其实这里有一个比较烧脑筋的东西就是,我们并不知道用户想要创建哪一个对象,那么我们要怎么设计呢?
我们可以让调用者传参数过来,根据参数来创建对象
传入的参数是String类型,传入的是我们在配置文件中写的key
可以创建一切想要的对象
public static Object getBean(String key){
Object obj=null;
try{
Class clazz=Class.forName(properties.getProperty(key));
obj=clazz.newInstance();
}catch(Exception e){
e.printStackTrace();
}
return obj;
}
3.4通用工厂的使用方式
我们定义通用工厂实际上是为了来创建对象
- 第一步定义类
第二步为了让工厂知道我们创建的类是哪一个类,所以我们可以通过配置文件的配置来告知工厂
- 以key=value的形式
第三步通过工厂来获得类的对象
- Object obj=BeanFactory.getBean("key");实际开发中在这里根据具体的需要进行类型转换
4.总结
Spring本质是工厂,不过这个工厂不需要我们来开发,Spring已经创建好这个工厂了,Spring创建的这个工厂叫ApplicationContext。
根据上面我们自己写的,我们可以看出来,除了工厂类以外,我们应该还要有配置文件,Spring中这个配置文件名字是applicationContext.xml