Spring初体验
- 三层架构的作用与Spring在三层架构中的作用
1.1:展现层(主要是前端,用于与用户交互,提交请求参数,返回后端传过来的数据)
1.2:业务层:是整个系统的核心,它与这个系统的业务(领域)有关。业务逻辑层的相关设计,均和特有的业务相关,例如搜索商品,,添加购物车,下订单等等。涉及到数据库的访问,则调用数据访问层。
1.3:数据访问层:主要是负责数据库的访问,简单来说就是在java层面使用sql语句对数据库的一系列操作,比如CRUD.如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。
2.三层结构的优缺点
优点:
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间
缺点:
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
3、增加了开发成本
Spring介绍:
其实Spring的项目非常的多,但是其实都是有关联的,就跟套娃一样,在最底层或者说最基础的框架就是Spring framework,其他所有的Spring框架例如Springboot,SpringCloud都是在Spring framework的基础上搭建的.
在Spring Framwork中,包含了Spring体系的核心机制及应用,包括IOC、AOP,SpringMVC、Data Access等。而且,即使在Spring Framework内部,各个功能之间也不是水平的,而是存在依赖关系的。
其中最底层,最核心的概念有两个:IOC和AOP。两者之间,尤以IOC为重。
Spring的优势:为什么Spring可以在那么多框架中统治了java领域呢,原因其实可以用一句话就可以解释:
Spring最大的优势就是他的解耦,可以简化开发.Spring就像一个大工厂,可以将所有的对象的创建和依赖关系的维护,交给Spring处理
方便集成各种优秀的框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。
耦合:
-
指的是程序中的依赖关系。
-
依赖关系还有很多种分类。
-
现在看到的是类的依赖。
- 解决依赖关系:
-
使用反射注册驱动
- 使用反射创建对象产生的问题:
-
驱动类字符串在代码中写死了,如果遇到修改,又要改源码。
- 解决写死了字符串的问题:
-
使用配置文件
- 在项目开发中,我们应该做到:
-
编译时期不依赖,运行时才依赖
Spring配置文件中的bean标签和属性:
**
Bean标签依赖注入:
1.构造方法函数注入依赖:
<bean id="name" class="java.lang.String">
<constructor-arg value="彭于晏"></constructor-arg>
</bean>
constructor-arg:使用构造方法注入依赖所使用的标签
<bean
id="" 对象引用名称 【重点】
name="" 对象引用名称
scope="" 指定对象单例、多例
class="" 对象的全名 (不能写接口) 【重点】
lazy-init="" 延迟创建对象
init-method="" 初始化方法
destroy-method=""/> 释放资源的方法,只对单例有效
**
**
2.使用set方法属性赋值:
<bean id="person2" class="com.itheima.entity.Person">
<!--person类提供set方法-->
<property name="id" ref="id"></property>
<property name="name" ref="name"></property>
</bean>
****使用set方法给属性赋值:setid:set后面的就是属性,必须是小写
**
案例:通过Spring管理dao层和service层
代码:
dao层的父接口,父接口永远不会改变,如果要更改数据库,只会修改实现类(遵循开闭原则,不允许修改,只允许通过实现类拓展功能)
public interface UserDao {
//数据访问层
void save();
}
dao层实现类:这里以后会写SQL语句,假设现在是在调用Mysql数据库,所以写的SQL语句也是Mysql的语句,如果以后客户想要更换数据库,比如换成Oracle数据库,那么只要重新写一个Oracle的实现类即可,不需要修改源代码
public class UserDaoimpl implements UserDao {
@Override
public void save() {
System.out.println("访问MySql数据库");
}
//数据访问层实现类
}
Service层:业务层接口,如果以后业务层的功能需要扩展,那么可以不用修改源代码,只需要加多一个实现类就可以实现
public interface UserService {
//业务层接口
void save();
}
**Service层实现类:注意:这里为什么要加一个setUserDao方法?
因为以前的方法是在service层中直接写死了UserDao,那么以后如果要修改的话就要修改源代码,这样就违反了开闭原则,那么现在只是在Service中定义了一个成员变量的UserDao对象,那么到时候如果dao层要修改的话就会方便很多,因为service的save方法需要用到userdao中的save方法,那么怎样才能将userdao传进来呢?方法就是在service中加入一个userdao成员变量,然后再使用setuserdao的方法传入一个userdao对象,那么既可以解耦又可以调用userdao中的数据访问方法了
**
public class UserServiceImpl implements UserService {
private UserDao userDao ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
// 通过set方法,交给spring的ioc容器依赖注入
userDao.save();
}
//业务层实现类
}
配置文件:
<!--首先创建UserDao对象-->
<!--class写userdao的实现类-->
<bean id="userdao" class="com.itheima.dao.daoimpl.UserDaoimpl"></bean>
<bean id="userservice" class="com.itheima.Service.ServiceImpl.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
首先先创建userdao的实现类对象,父类调用子类(多态),然后将userdao对象作为service层中的成员变量userdao,其实就是使用UserDao(dao层)给service中的userdao变量(属性)赋值,使用到的就是ref标签,ref标签的作用就是引用容器内的其他对象作为这个对象的属性值