一 介绍
Spring是于2003 年兴起的一个full-stack轻量级的Java 开源框架,由Rod Johnson创建 full-stack:全栈。表现层(springMVC)、业务层(事务管理 spring ioc)、持久层(spring JdbcTemplate)等,还能 与市面上主流的其他框架(struts1、struts2、mybatis、jpa、Hibernate等)进行整合。 轻量级:占用的资源相对较小。对比着JavaEE(EJB重量级)来讲的。 b、Spring以IOC(控制反转)和AOP (面向切面编程)为核心
Spring 使用使用对象类 即Bean 的管理
* web层:springMVC 表现层
* service层: spring ioc 业务层
* dao层:spring jdbcTemplate 持久层
(目前我的理解就是MVC模式 将业务逻辑处理与数据获取 展示进行分割 解耦和 表现层调用业务层、业务层调用持久层)
二 (理解)利用工厂解耦
2.1 首先三层架构开发 (在idea中先搭建Maven 在創建Spring,可參考
https://blog.youkuaiyun.com/gxflh/article/details/109025091)
step1 Dao层
编写Dao层
package com.itheima.dao;
public interface UserDao {
void saveUser();
}
编写dao实现
package com.itheima.dao.impl;
import com.itheima.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("Dao执行了saveUser方法");
} }
step 2 Service层
编写业务接口
package com.itheima.service;
public interface UserService {
void regist();
}
编写业务实现
package com.itheima.service.impl;
import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import com.itheima.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void regist() { userDao.saveUser();
} }
step3 Web层
编写表现层:此处用单元测试
package com.itheima.test; import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;
import org.junit.Test;
public class UserServiceTest {
private UserService userService = new UserServiceImpl();
@Test public void testRegist(){ userService.regist();
} }
以上存在的问题
开闭原则:
开:支持扩展。 闭:已经存在的代码如果已经运行了,不能修改。
UserServiceImpl中要想切换Dao的实现,目前需要修改源代码(在运行期间是不可取的)。
解决办法:使用工厂设计模式
使用:
如果要更换dao的实现,还是需要修改工厂源码的。(Server具体依赖Dao,转嫁到了工厂中)
改进(将Factory中的GetUserDao方法替换成xml 配置文件加载持久层不同对象 通过dom解析过去不同持久层对象的方法):
step1、建立一个xml配置文件(Resources目录下) User.xml 这文件是在自己创建工厂的情况下使用的配置 在工厂使用中
// List<Node> nodes=document.selectNodes("/beans/bean");这个地方使用到了
step2、修改工厂
step2.1导入dom4j的坐标
-
<dependency>
-
<groupId>dom4j</groupId>
-
<artifactId>dom4j</artifactId>
-
<version>1.6.1</version>
-
</dependency>
-
<dependency>
-
<groupId>jaxen</groupId>
-
<artifactId>jaxen</artifactId>
-
<version>1.1.6</version>
-
</dependency>
step2.2修改工厂 ,工厂的作用:创建对象,隐藏对象的创建细节
public class UserFactory {
//
private static Map<String,Object> userContainer=new HashMap<String, Object>() ;
//
static {
// 加載Bean 文件
InputStream in=UserFactory.class.getClassLoader().getResourceAsStream("User.xml");
//
SAXReader saxReader=new SAXReader();
try {
//
Document document=saxReader.read(in);
//
List<Node> nodes=document.selectNodes("/beans/bean");
//
for (Node n : nodes){
//
String id=n.valueOf("@id");
//
String className=n.valueOf("@class");
//
userContainer.put(id,Class.forName(className).newInstance());
}
} catch (DocumentException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//从容器中查找指定名称的对象
public static Object getBean(String name){
return userContainer.get(name);
}
//获取对象:泛型(选看)
public static <T> T getBean(String name,Class<T> clazz){
return (T)userContainer.get(name);
}
}
但是自己写工厂模式使用局限性太大,一个项目中 Mybaits Spring 可能公用一个工厂模式,此时局限性就体现出了。在此情况先 我们就借用Spring核心配置文件,将配置文件中配置的对象存放到一个容器中,使用对象从容器中根据名字查找即可。
下面则使用Spring 配置文件使用封装处理好的BeanFactory文件
3. (重要)Ioc的总结 IoC:Inverse Of Control反转控制。实际就是指控制权发生了转移(由自己空转转为被动接受)。借助 配置文件,将配置文件中配置的对象存放到一个容器中,使用对象从容器中根据名字查找即可。
下面开始IOC入门的事件练习(重点)spring的ioc入门案例
4.1. 搭建开发环境 step1、建立一个新的模块
idea 创建maven项目 在添加Spring
step2、导入核心坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency>
step3、在resource文件夹下建立一个spring的核心配置文件 (右击建立的Maven项目 如图所示)
step4、建立dao接口
package user.dao.Interface; public interface UserDaoInterface { void saveUser(); }
step5、建立dao的实现类
package user.dao.Impl; import user.dao.Interface.UserDaoInterface; public class UserDaoImpl implements UserDaoInterface { public void saveUser() { int i=0; i=+i; System.out.println("打印数据i"+i); } }
step6、在配置文件中配置dao
step7、初始化spring容器
接下来就是单元测试就行了
其他配置参考我上传的Spring学习文件