从JavaWeb到Spring零基础入门

文章介绍了Spring框架的核心概念,包括IOC(控制反转)和DI(依赖注入),通过示例展示了如何降低代码耦合。同时提到了AOP(面向切面编程)的思想,用于解决通用功能如事务和日志的横向抽取问题。文中还涵盖了Spring的层次结构和技术栈,并提供了基于XML配置的Bean管理示例,以及BeanFactory和ApplicationContext的区别与使用。
摘要由CSDN通过智能技术生成

学习大纲

  • IOC基础容器

  • AOP切面编程

  • Spring整合web环境

  • Spring MVC 

JavaWeb到Spring概述

  • 传统javaweb开发缺点

    • //账户信息修改业务方法
          public void updateUserInfo(User user){
              try {
                  DaoUtils.openTransaction();//开启事务
                  UserDao userDao = new UserDaoImpl();//获得UserDao执行插入user数据到数据库操作
                  userDao.updateUserInfo(user);
                  UserLog userLog = new UserLogImpl();//修改成功后,向用户行为日志表插入一条数据,内容:修改时间等信息
                  userLog.recodeUserUpdate(user);
                  DaoUtils.commit();//提交事务
              }catch (Exception e) {
                  DaoUtils.rollback();//回滚事务
                  ExceptionLog exceptionLog = new ExceptionLogImpl();//向异常事务表中插入数据
                  exceptionLog.recodeException(this,e);
              }
          }
      • UserDao userDao = new UserDaoImpl();
        UserLog userLog = new UserLogImpl();
        ExceptionLog exceptionLog = new ExceptionLogImpl();

        以上代码中都需要系统运作时由系统new三个对象,使得耦合性比较高

        (例如,当UserDaoImpl实现切换实现接口UserDaoImpl时则需要修改源码)

        解决思路:程序代码中无需手动new对象,而是通过第三方根据要求为程序提供所需的Bean对象
      • DaoUtils.openTransaction();
        UserLog userLog = new UserLogImpl();
        userLog.recodeUserUpdate(user);
        DaoUtils.commit();
        DaoUtils.rollback();
        ExceptionLog exceptionLog = new ExceptionLogImpl();
        exceptionLog.recodeException(this,e);

        通用事务功能与通用日志功能严重耦合在业务代码中

        解决思路:程序代码中无需手动new对象,而是通过第三方根据要求为程序提供所需的Bean对象的代理对象
  • IoC、DI、AOP思想

    • IoC(控制反转思想)

      • 原先:需要什么对象就在代码中手动new

      • 控制反转:将new对象的权力反转给第三方

    • DI(依赖注入思想)

      例子:Bean1的内部需要设置Bean2才可以达到目标效果

      • 原先:程序代码分别从第三方获取Bean1、Bean2,再写一段代码将Bean2设置到Bean1

      • 依赖注入:第三方在创建Bean1的过程中就创建Bean2并自动设置给Bean1

    • AOP(面向切面思想)

      面向对象编程:纵向设计

      面向切面编程:横向抽取

      • 主要实现方式:Proxy(代理)
  • Spring Framework 基础介绍

    • 技术栈:

      1. 第一层(最底层,以下所有技术都以上一层为地基):

        • Test : 单元测试与集成测试
      2. 第二层:

        • Core Container:核心容器

          • Beans

          • Core

          • Context

          • SpEL

      3. 第三层:

        • AOP:面向切面编程

        • Aspects:AOP思想实现

        • Instrumentation

        • Messaging

      4. 第四层

        • Data Access/Data Integration:数据访问/数据集成

          • JDBC

          • ORM

          • OXM

          • JMS

          • Transactions

        • Web

          • WebSocket

          • Servlet

          • Web

          • Portlet

  • 基于xml的Spring应用

  • 基于注解的Spring应用

BeanFactory解析

开发步骤:

flowchart TB
A(程序代码)-->B(第三方)
B-->C(配置清单)
C-->D(Bean类)
C-->E(Bean类)
  1. 导入Spring的jar包/Maven坐标

     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>5.3.25</version>
     </dependency>
  2. 定义接口以及其实现类(Beans)

  3. 创建xml配置文件,并配置Bean类信息

    创建XML Configuration File->Spring Config

    <bean id="userService" class="com.xiaowan.Impl.UserServiceImpl"/>

测试代码:创建BeanFactory,加载配置文件,获取UserService对象

//创建工厂对象
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//创建读取器(读取xml文件)
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
//读取配置文件给工厂
reader.loadBeanDefinitions("beans.xml");
//根据id获取Bean对象
UserService userService = (UserService) beanFactory.getBean("userService");

成功实现控制反转

以下实现依赖注入

传统情况下:

UserServiceImpl需要调用UserDao启动,则:

配置Bean类信息:

<bean id="userService" class="com.xiaowan.service.Impl.UserServiceImpl"></bean>
<bean id="userDao" class="com.xiaowan.dao.impl.UserDaoImpl"/>

手动实例化两个Bean然后将userDao配置给userService

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
实现依赖注入:

配置清单

<bean id="userService" class="com.xiaowan.service.Impl.UserServiceImpl">
    <property name="userDao" ref="userDao">
    </property>
</bean>
<bean id="userDao" class="com.xiaowan.dao.impl.UserDaoImpl"/>

property中

name:com.xiaowan.service.Impl.UserServiceImpl的userDao对象

ref:清单中的类

在userServiceImpl中编写方法

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    //BeanFactory去调用本方法,从容器中获取userDao设置到此处
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("BeanFactory调用方法:"+userDao);
    }

}
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService");

成功实现userService的实例

BeanFactory开发中很少直接使用的,BeanFactory更多的是作为核心底层

ApplicationContext

Spring容器,内部封装了BeanFactory

使用:

创建配置清单 ApplictionContext.xml

测试使用:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplictionContext.xml");
UserService userService =(UserService) applicationContext.getBean("userService");
BeanFactory和 ApplicationContext的关系
  • BeanFactory(Bean工厂):

    • Spring的早期接口

    • API偏向于底层

    • 封装着Bean创建的主要逻辑和功能

    • Bean的初始化时机:首次调用getBean时创建Bean

  • ApplicationContext(Spring容器):

    • Spring的后期高级接口

    • 对BeanFactory的API进一步封装

    • 继承BeanFactory并且维护BeanFactory的引用,BeanFactory与ApplicationContext关系:继承与融合

    • Bean的初始化时机:配置文件加载,容器创建成功之时实例化Bean并初始化

仅仅在spring-context基础环境下的继承关系

实现类功能描述
ClassPathXmlApplicationContext加载类路径下xml配置的ApplicationContext
FileSystemXmlApplicationContext加载磁盘路径下的xml配置的ApplicationContext
AnnotationConfigApplicationContext加载注解配置类的ApplicationContext

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值