Spring学习第一天,使用bean标签创建对象

Spring初体验

  1. 三层架构的作用与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为重。
**其中最底层,最核心的概念有两个: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标签的作用就是引用容器内的其他对象作为这个对象的属性值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值