IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring(初恋篇) -> 正文阅读

[Java知识库]Spring(初恋篇)

Spring简介

  • Spring是什么

    Spring 是分层的java SE/EE应用full-stack 轻量级开源框架,以**IOC(Inversion Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)**为内核。

    提供了 展现层SpringMVC和持久层Spring JDBCTemplate 以及业务层事务管理等众多企业级应用技术,还整合开源世界著名的第三方框架和类库,逐渐成为使用最多的Java EE企业级应用开源框架

  • Spring的优势

    • 方便解藕简化开发

    通过Spring提供的IOC容器,可以将对象的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合,用户也不再为单例模式类,属性文件解析等这些底层需求编写代码,可以专注于上层应用。

    • AOP编程的支持

    通过Spring的AOP功能,方便进行面向切面编程,许多不容易用传统的OOP实现的功能可以用AOP轻松实现。

    • 声明式事务的支持

    可以将我们从单调繁琐的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。

    • 方便程序的测试

    可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事。

    • 方便集成各种优秀的框架

    Spring对各种优秀框架(Struts , Hibemate,Hessian,Quartz等)的支持

    • 降低Java EE API的使用难度

    Spring 对JavaEE API (例如JDBC ,JavaMail,远程调用)进行薄薄的封装层,使用这些API的使用难度大为降低。

    • Java源码是经典学习范例

    Spring的源代码设计精妙,结构清晰,匠心独用,处处体现值大师对java设计模式灵活的运用及对java技术的高深造诣。他的源代码无疑是java技术的最佳实践范例

Spring快速入门

  • Spring程序的开发步骤

  • 导入Spring开发的基本包坐标

    开启maven项目,导入spring坐标依赖

    <!--spring 框架依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.8</version>
    </dependency>
    
  • 编写Dao接口和实现类

    public interface UserDao {
        void save();
    }
    
    
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void save() {
            System.out.println(" save success");
        }
    }
    
  • 创建Spring核心配置文件(applicationContext.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl"></bean>
    
    </beans>
    
  • 在Spring配置文件中配置UseDaoImpl

  • 使用Spring的API获得Bean实例

    public class MyTest {
        public static void main(String[] args) {
            ApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao =(UserDao) app.getBean("userDao");
            userDao.save();
    
        }
    }
    

Spring目录结构
在这里插入图片描述

Spring配置文件

class: 类权限名称

id:唯一标识符

  • Bean标签基本范围配置

scope:指对象的作用范围

取值范围说明
singeton默认的,单例的
prototype多例的
requestWEB项目中,Spring创建一个Bean对象,将对象存入到request域中
sessionWEB项目中,Spring创建一个Bean对象,将对象存入到session域中
global sessionWEB项目中,应用在portlet环境,如果没有Portlet环境那么globalSession相当于session
  • 当scope的取值为singleton

    Bean的实例个数:1个

    Bean的实例时机:当Spring核心文件被加载时,实例化配置的Bean实例

    Bean的生命周期:

    • 对象创建:当应用加载时,创建容器时,对象就被创建了
    • 对象运行: 只要容器存在,对象一直存活
    • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

    代码验证

    <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl" scope="singleton"></bean>
    
    public class UserDaoImpl implements UserDao {
        public UserDaoImpl() {
            System.out.println("对象被创建了");
        }
    
        @Override
        public void save() {
            System.out.println(" save success");
        }
    }
    ApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao1 =(UserDao) app.getBean("userDao");
            UserDao userDao2 =(UserDao) app.getBean("userDao");
    
  • 当scope的取值为prototype时

    Bean的实例化个数:多个

    Bean的实例化时机:当调用getBean()方法时实例化Bean

    • 对象创建:当使用对象时,创建新的对象实例
    • 对象运行:只要对象在使用中,就一直存活
    • 对象销毁: 当对象长时间不用时,就被 java垃圾回收器回收

    代码验证:

    更改配置其他不变

    <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl" scope="prototype"></bean>
    
  • Bean生命周期配置

    • init-method:指定类中的初始化方法名称
    • destroy-method:指定类中的销毁方法的名称
    <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"></bean>
    
    public class UserDaoImpl implements UserDao {
    
        public void init(){
            System.out.println("对象 被初始化了");
        }
        public void destroy(){
            System.out.println("对象 被销毁了");
        }
        @Override
        public void save() {
            System.out.println(" save success");
        }
    }
    public class MyTest {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao1 =(UserDao) app.getBean("userDao");
            UserDao userDao2 =(UserDao) app.getBean("userDao");
            app.close(); // 验证对象销毁
    
        }
    }
    
  • Bean实例化的三种方法

    • 无参数构造方法实例化
    <!--id 为唯一标识  class 实现类权限名称-->
    <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl" ></bean>
    
    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
            System.out.println(" save success");
        }
    }
    
    public class MyTest {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao =(UserDao) app.getBean("userDao");
            userDao.save();
    
        }
    }
    
    • 工厂静态方法实例化
    <bean id="userDao" class="com.zhj.factory.Factory" factory-method="factory" ></bean>
    
    public class Factory {
        public static UserDao factory(){
            return new UserDaoImpl();
        }
    }
    
    public class MyTest {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao =(UserDao) app.getBean("userDao");
            userDao.save();
    
        }
    }
    
    • 工厂实例方法实例化
    <bean id="factory" class="com.zhj.factory.PlainFactory"  ></bean>
    <bean id="userDao" factory-bean="factory" factory-method="factory"></bean>
    
    public class PlainFactory {
        public UserDao factory(){
            return new UserDaoImpl();
        }
    }
    
    public class MyTest {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao =(UserDao) app.getBean("userDao");
            userDao.save();
    
        }
    }
    
  • Bean依赖注入的概念

    ? 依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。

    ? 在编写程序时,通过控制反转,把对象的创建交给Spring,但是代码中不可能出现没有依赖的情况。IOC解藕只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

    ? 那这种业务层和持久层的依赖关系,在使用Spring之后,就让Spring来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

    • Bean的依赖注入方式

      怎么将UserDao注入到ServiceDao内部呢?

      • 构造方法

        步骤:

        1. 在ServiceDaoImpl内部设置含参ServiceDao的构造方法

          public class ServiceDaoImpl implements ServiceDao {
              private UserDao userDao;
          
              public ServiceDaoImpl(UserDao userDao) {
                  this.userDao = userDao;
              }
          
              @Override
              public void save() {
                  this.userDao.save();
              }
          }
          
        2. 修改注入方式

          <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl"></bean>
          
          <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl">
                  <!--name: 实现类的首字母小写, ref :userDao的id-->
                  <constructor-arg name="userDao" ref="userDao"></constructor-arg>
          </bean>
          

        简便方式:构造方法注入

        1. p命名空间注入

        2. 修改注入方式

      • set方法

        步骤:

        1. 在ServiceDaoImpl内部设置set方法

          public class ServiceDaoImpl implements ServiceDao {
              private UserDao userDao;
          
              public void setUserDao(UserDao userDao) {
                  this.userDao = userDao;
              }
          
              @Override
              public void save() {
                  this.userDao.save();
              }
          }
          
        2. 修改注入方式(配置applicationContext文件)

          <!--这里的id 是userDao唯一标识-->
          <bean id="userDao" class="com.zhj.dao.impl.UserDaoImpl"></bean>
          <!--这里的id是serviceDao的唯一标识-->
          <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl">
            			<!--name 是 set 后的首字母小写的单词,ref是 userDao的id-->
                  <property name="userDao" ref="userDao"></property>
          </bean>
          

        简便方式:set方法注入

        1. P命名空间注入(本质是set方法注入),引入p命名空间

          xmlns:p="http://www.springframework.org/schema/p"
          
        2. 修改注入方式

          <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl" p:userDao-ref="userDao"/>
          
  • Bean的依赖注入的数据类型

    ? 上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通的数据类型,集合都可以在容器中进行注入

    ? 注入数据的三种数据类型(代码全部使用set实现)

    • 普通的数据类型

      public class ServiceDaoImpl implements ServiceDao {
          private String name;
          private Integer age;
      
          public void setName(String name) {
              this.name = name;
          }
      
          public void setAge(Integer age) {
              this.age = age;
          }
      
          @Override
          public void save() {
              System.out.println(this);
          }
      
          @Override
          public String toString() {
              return "ServiceDaoImpl{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      '}';
          }
      }
      
      <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl">
              <property name="name" value="zhangsan" />
              <property name="age" value="33" />
      </bean>
      
    • 引用数据类型

      <!--list集合-->
      <bean id="serviceDao" class="com.zhj.controller.impl.ServiceDaoImpl">
          <property name="stringList" >
              <list>
                  <value>111</value>
                  <value>222</value>
                  <value>333</value>
              </list>
          </property>
      </bean>
      
    • 集合数据类型

      <!--map集合-->
      <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl">
              <property name="stringUserMap">
                  <map>
                      <entry key="zhangsan" value-ref="user1"></entry>
                      <entry key="lisi" value-ref="user2"></entry>
                  </map>
              </property>
          </bean>
      <bean id="user1" class="com.zhj.domain.User">
          <property name="name" value="zhangsan"></property>
          <property name="age" value="333"></property>
      </bean>
      <bean id="user2" class="com.zhj.domain.User">
          <property name="name" value="lisi"></property>
          <property name="age" value="444"></property>
      </bean>
      
      <!--property集合-->
      <bean id="serviceDao" class="com.zhj.controller.Impl.ServiceDaoImpl">
          <property name="properties">
              <props>
                  <prop key="zhangsan">333</prop>
                  <prop key="lis">444</prop>
                  <prop key="wangwu">555</prop>
      
              </props>
          </property>
      </bean>
      
  • 引入其他配置文件(分模块开发)

    在实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置文件拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载

    <import resource="applicationContext-xxx.xml" />
    
    Spring重点配置
<bean>标签
		id属性:在容器中Bean实例的唯一标识,不允许重复
		class属性:要实例化的Bean的权限定名
		scope属性:Bean的作用范围,常用Singleton(默认)和prototype
		<property>标签:属性注入
					name属性:属性注入
					value属性:注入普通属性值
					ref属性:注入对象引用值
					<list>标签
					<map>标签
					<properties>标签
		<constructor-arg>标签
<import>标签:导入其他spring分文件

Spring 相关API

  • ApplicationContext的继承体系

    applicationContext:接口类型,代表应用上下文,可以通过其实例获得Spring容器中的Bean对象

  • ApplicationContext实现类

    • ClassPathXmlApplicationContext: 它是从类的根路径下加载配置文件推荐使用
    • FileSystemXmlApplicationContext: 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置
    • AnnotationConfigApplicationContext:当使用注解配置容器对象时,需要使用此类来创建spring容器,它用来读取注解。
  • getBean()方法的使用

    • app.getBean(“id”) :推荐
    • app.getBean(typeClass)
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:30:26  更:2021-07-11 16:32:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 18:03:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码