




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章初识Spring框架《JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)(第3版)》学习目标/Target了解框架的相关概念了解Spring框架的概念,能够简述Spring框架的优点熟悉Spring框架的体系结构和核心概念,能够简述Spring框架的体系结构中各模块的作用掌握Spring入门程序,能够在项目中通过Spring框架实现控制反转章节概述/Summary在现代的软件开发领域中,构建健壮、高效地应用程序是每个开发者的追求。然而,随着项目规模的扩大和技术的日新月异,开发过程中面临着代码耦合度高、配置繁琐、事务管理复杂等诸多挑战。基于此Spring框架应运而生,Spring框架以其IoC容器、AOP支持、声明式事务管理等诸多功能为开发者提供了灵活、强大的开发支持,使得项目开发变得更加简洁、高效。本章将对Spring框架的基础知识进行详细地讲解。目录/Contents1.11.2框架概述Spring框架简介1.3Spring入门程序框架概述1.11.1
框架概述先定一个小目标!
先定一个小目标!了解框架的的相关概念1.1
框架概述框架(Framework)一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域中,框架指的是一种预先设计好的软件架构,它提供了通用的解决方案和功能模块,以便开发人员能够在其基础上构建应用程序。框架通常包括一系列预定义的类、接口、函数和工具,旨在简化开发过程、提高效率并确保代码的可维护性和可扩展性。通过使用框架,开发人员可以专注于业务逻辑的实现,而无需重复编写通用的代码,从而加速开发并提高代码质量。1.1
框架概述Hibernate是一个优秀的ORM(ObjectRelationalMapping,对象关系映射)框架,它允许开发人员使用面向对象的方式来操作数据库,而不必编写传统的SQL查询语句。通过在Java类和数据库表之间建立映射关系,Hibernate可以自动执行数据库操作,包括存储、更新、检索和删除数据。Hibernate还提供了缓存、事务管理、延迟加载等高级功能,使得数据持久化变得更加简单和高效。Hibernate框架当前JavaEE开发中较为常见的主流框架。1.1
框架概述MyBatis是流行的持久层框架,它使用XML配置文件或注解来定义SQL映射,将Java对象与数据库记录之间进行映射。相对于Hibernate,MyBatis更加灵活,可以直接编写原生的SQL查询语句,同时保留了对象关系映射的优势。MyBatis提供了强大的SQL控制能力,而且其轻量级的特性使得它易于上手和学习,为用户提供了高效且灵活的数据库交互体验。MyBatis框架1.1
框架概述Spring是一个开源框架,旨在解决企业应用程序开发中的复杂性,它可以将应用程序中的单层框架(只为应用程序中某一层提供解决方案的框架)以最佳方式整合在一起。这种设计使得开发人员能够更专注于每个层的具体实现,而无需过多关注层与层之间的交互细节,从而构建出一个连贯且强大的体系。Spring不仅简化了开发流程,还提供了更为完善的开发环境,使得POJO(PlainOldJavaObject,普通Java对象)能够轻松获得企业级服务支持。Spring框架1.1
框架概述SpringMVC是Spring框架中的一个模块,用于构建基于MVC(ModelViewController,模型视图控制)模式的Web应用程序。通过将请求映射到相应的处理程序、支持多种视图技术和提供灵活的请求处理机制,SpringMVC可以帮助开发人员构建灵活、易于维护的Web应用程序。SpringMVC框架1.1
框架概述SpringBoot是一个旨在简化Spring应用程序初始搭建和开发过程的框架。SpringBoot提供了自动配置、嵌入式Web服务器、健康检查、外部化配置等功能,使得开发人员可以快速搭建生产就绪的Spring应用程序,而无须烦琐的配置。SpringBoot框架1.1
框架概述SpringCloud是一套用于构建分布式系统的微服务架构工具集合。它提供了多个子项目,如服务发现、负载均衡、断路器、分布式配置等,帮助开发人员构建可扩展、弹性和高可用的微服务架构。SpringCloud与SpringBoot结合使用,能够更好地支持微服务应用程序的开发和部署。SpringCloud框架Spring框架简介1.21.2.1
Spring框架概述先定一个小目标!
先定一个小目标!了解Spring框架的概念,能够简述Spring框架的优点1.2.1
Spring框架概述JavaEE的早期开发开发人员被鼓励使用EJB作为主要的开发方式。暴露出了许多问题:使用复杂性高、代码冗余、代码侵入性强、开发周期长以及移植性差等。使用Spring框架开发Spring框架采用了IoC和AOP的概念,通过依赖注入、面向切面编程等机制,大大简化了开发过程。Spring框架代码简洁、灵活性高、可测试性强、可重用性好,并且更易于集成到不同的环境中1.2.1
Spring框架概述Spring框架提供了对SpringMVC、Struts2等框架的整合,帮助开发人员构建灵活可扩展的Web应用程序在表现层方面Spring框架提供了管理事务和日志记录等功能,帮助开发人员编写清晰、可维护的业务逻辑在业务逻辑层方面Spring框架可以整合MyBatis、Hibernate、JdbcTemplate等技术,帮助开发人员与数据库进行高效交互,实现数据持久化在持久层方面Spring框架为三层体系架构的每个层次提供的技术支持1.2.1
Spring框架概述Spring框架的优点:1.
非侵入式设计2.
降低耦合度,方便开发3.
支持AOP编程4.
支持声明式事务5.
方便程序的测试6.
方便集成各种优秀框架7.
降低JavaEEAPI的使用难度1.2.2Spring框架的体系结构和核心概念先定一个小目标!
先定一个小目标!熟悉Spring框架的体系结构和核心概念,能够简述Spring框架的体系中各模块的作用1.2.2Spring框架的体系结构和核心概念Spring框架的体系结构1.2.2Spring框架的体系结构和核心概念Context模块Context模块构建于Beans模块和Core模块之上,提供了更丰富的应用上下文信息管理功能Beans模块Beans模块提供了对BeanFactory等工厂模式的实现,Beans模块的主要作用是创建和管理BeanSpEL模块SpEL模块是Spring3.0后新增的模块,提供了对SpEL表达式语言Core模块Core模块提供了Spring框架的基础功能,包括IoC(控制反转)和DI(依赖注入)功能,是整个Spring框架的核心所在核心容器(CoreContainer)1.2.2Spring框架的体系结构和核心概念0102030405JDBC模块简化了JDBC编码的过程,同时还可以处理那些数据库供应商特有的错误代码ORM模块提供了对主流的对象关系映射(ORM)框架的集成支持OXM模块提供了对XML映射的抽象支持,可以与各种XML绑定框架(如JAXB、Castor、XMLBeans等)进行集成JMS模块主要用于处理消息传递,包括消息的生产和消费Transactions模块负责事务管理,通过注解或配置文件可以实现声明式事务管理JDBC模块ORM模块OXM模块JMS模块数据访问及集成(DataAccess/Integration)Transactions模块1.2.2Spring框架的体系结构和核心概念WebSocket模块WebSocket模块提供了对WebSocket和SockJS的支持,以及对STOMP协议的实现SpringWeb模块SpringWeb模块提供了Web开发的基本支持,包括处理文件上传、HTTP客户端、Spring远程处理支持等功能Portlet模块Portlet模块是专门为Portlet环境设计的模块,提供了针对Portlet环境下的MVC实现Servlet模块Servlet模块用于构建Web应用程序的RESTful服务Web1.2.2Spring框架的体系结构和核心概念0102030405AOP模块提供了对面向切面编程的支持,允许开发者定义切面(Aspect)来截取应用程序的流程,并在切入点上执行额外的行为Aspects
模块提供了与AspectJ集成的支持,AspectJ是一个功能强大且成熟的AOP框架Instrumentation模块提供了对类工具的支持,并且实现了类加载器Messaging模块提供了对消息传递体系结构和协议的支持Test模块提供了对程序单元测试和集成测试的支持AOP模块Aspects
模块Instrumentation
模块Messaging模块其他模块Test模块IoC(InversionofControl,控制反转)是Spring框架的核心理念之一,旨在构建低耦合的应用程序,降低代码的复杂度。控制反转的思想倡导将对象的创建和管理交给容器,容器负责实例化对象、管理对象的生命周期以及注入依赖关系。这样对象的控制权就从应用程序转移到了容器,因此称为控制反转。Spring框架提供了实现IoC思想的IoC容器,通常谈及Spring容器时,指的就是Spring框架中的IoC容器。Spring框架的IoC容器主要包括BeanFactory和ApplicationContext,这些IoC容器负责对象的实例化、装配、配置和管理。IoCSpring框架的核心概念1.2.2Spring框架的体系结构和核心概念DI(DependencyInjection,依赖注入)是IoC的一种实现方式,它通过外部配置(如IoC容器)在对象创建时自动将其所依赖的其他对象注入到该对象中,而不是让对象内部自行创建和管理这些依赖。依赖注入可以通过构造函数、setter方法或接口等多种方式实现,从而提高了代码的可测试性、可维护性和可重用性。DI1.2.2Spring框架的体系结构和核心概念在Spring框架中,Bean是指由Spring容器管理的对象实例,由Spring的IoC容器创建和管理。开发者可以通过在配置文件或配置类中定义Bean的属性和依赖关系,IoC容器会根据配置信息实例化Bean,并将其加入到容器中进行管理。通过Bean的定义和配置,可以实现对象的控制反转和依赖注入,实现低耦合的组件化开发。Bean1.2.2Spring框架的体系结构和核心概念Spring入门程序1.31.3Spring入门程序先定一个小目标!
先定一个小目标!掌握Spring入门程序,能够在项目中通过Spring框架实现控制反转(1)创建项目并引入依赖文件1-1pom.xml源代码在IDEA中创建名称为chapter01的Maven项目,入门程序需要使用Spring框架的功能对此在项目的pom.xml文件中引入Spring框架相关的依赖,具体如文件1-1所示。1.3Spring入门程序(2)自定义接口和实现类文件1-2
UserDao.java文件1-3UserDaoImpl.java源代码在chapter01项目的src/main/java目录下创建com.itheima.dao包,并在该包下自定义接口UserDao和接口对应的实现类UserDaoImpl,具体代码如文件1-2和文件1-3所示。1.3Spring入门程序(3)创建配置文件并定义Bean文件1-4applicationContext.xml源代码在chapter01项目的src/main/resources目录下创建applicationContext.xml文件作为Spring入门程序的配置文件,并在applicationContext.xml配置文件中定义Bean,具体代码如文件1-4所示。1.3Spring入门程序(4)定义测试类文件1-5TestHelloSpring.java源代码在chapter01项目的com.itheima文件夹下创建测试类TestHelloSpring,具体代码如文件1-5所示。1.3Spring入门程序(5)测试效果在IDEA中启动测试类TestHelloSpring,控制台的输出结果如下图所示。1.3Spring入门程序本章小结本章主要讲解了Spring框架的基础知识,首先介绍了框架的相关知识;然后讲解了Spring框架的概念、体系结构和核心概念;最后编写了Spring入门程序。通过本章的学习,读者可以对Spring框架的基础有个大致的了解,为框架开发打下坚实基础。本章小结第2章Spring中Bean的管理《JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)(第3版)》学习目标/Target了解Spring的IoC容器,能够简述两个常见的IoC容器熟悉Bean的作用域,能够简述Bean的5种作用域的特点,以及作用域的配置方式掌握Bean的配置,能够基于XML文件、基于注解和基于Java类实现Bean的配置学习目标/Target掌握Bean的实例化,能够使用构造方法、静态工厂、实例工厂的方式实例化Bean掌握Bean的装配方式,能够基于XML的装配、基于注解的装配和自动装配实现Bean的装配掌握Bean的生命周期方法的使用,能够定义Bean的初始化方法和销毁方法章节概述/Summary在Spring框架中,控制反转和依赖注入的实现都基于Spring的Bean管理。Spring的Bean管理是指Spring框架通过IoC容器来管理应用程序中的Bean,主要包括Bean的配置、实例化、注入等。本章对Spring中Bean的管理进行详细讲解。目录/Contents2.12.2Spring的IoC容器Bean的配置2.3Bean的作用域目录/Contents2.42.5Bean的实例化Bean的装配方式2.6Bean的生命周期Spring的IoC容器2.12.1
Spring的IoC容器先定一个小目标!
先定一个小目标!了解Spring的IoC容器,能够简述两个常见的IoC容器Spring框架的IoC容器在Bean的管理中扮演着不可或缺的角色,IoC容器为应用程序提供了便利的Bean管理机制。常见的IoC容器有BeanFactory和ApplicationContext,下面将对这两个IoC容器进行讲解。2.1
Spring的IoC容器BeanFactory是Spring框架中最基础的IoC容器之一,BeanFactory采用延迟加载的方式创建Bean的实例,即只有在首次请求某个Bean时才会创建该Bean的实例。BeanFactory是一个接口,它定义了管理和获取Bean对象的基本功能。BeanFactory2.1
Spring的IoC容器2.1
Spring的IoC容器方法描述ObjectgetBean(Stringname)根据指定的名称name获取Bean<T>TgetBean(Stringname,Class<T>type)根据指定的名称name和类型type获取Bean<T>TgetBean(Class<T>requiredType)根据指定的类型requiredType获取BeanObjectgetBean(Stringname,Object...args)根据指定的名称name和参数args获取BeanbooleanisTypeMatch(Stringname,
ResolvabletypeToMatch)判断是否有与指定名称name和类型typeToMatch相匹配的BeanClass<?>getType(Stringname)根据指定的名称name获取Bean的类型String[]getAliases(Stringname)根据指定的名称name获取与之对应的别名数组booleancontainsBean(Stringname)根据名称name判断Spring容器是否含有指定的BeanBeanFactory常用的方法ApplicationContext是BeanFactory接口的子接口,它继承了BeanFactory接口的所有功能,并且提供了比BeanFactory更丰富的功能和扩展点,是Spring应用程序开发中经常使用的组件之一。ApplicationContext在启动时会自动加载和初始化所有定义的Bean,这意味着在应用程序运行时,所有需要的Bean都已经准备就绪。Spring为了满足开发人员不同的需求提供了多个ApplicationContext接口的实现类,让开发人员可以根据项目的特点和需要选择合适的实现方式。ApplicationContext2.1
Spring的IoC容器2.1
Spring的IoC容器用于从类路径下的XML文件加载Bean的定义和配置信息,并解析配置文件中的信息初始化其中定义的BeanClassPathXmlApplicationContext用于从文件系统路径下的XML文件加载Bean定义FileSystemXmlApplicationContext基于Java类和注解加载定义的BeanAnnotationConfigApplicationContextApplicationContext常用的实现类Bean的配置2.22.2Bean的配置先定一个小目标!
先定一个小目标!掌握Bean的配置,能够基于XML文件、基于注解和基于Java类实现Bean的配置在Spring中,Bean的配置是指定义和配置应用程序中Bean的信息,以便IoC容器能够管理这些Bean。Spring中Bean的配置方式有基于XML文件的配置、基于注解的配置和基于Java类的配置。下面分别对这三种方式的配置进行讲解。2.2Bean的配置2.2Bean的配置1.基于XML文件配置BeanXML(ExtensibleMarkupLanguage,可扩展标记语言)是一种标准的数据传输和存储格式,广泛应用于各种领域,包括配置文件、数据交换、Web服务等。在Spring中,基于XML文件配置Bean是一种常见且传统的方式,通过使用<bean>标签来定义和配置应用程序中的Bean。每个<bean>标签可以定义一个Bean。2.2Bean的配置属性描述id用于指定Bean在容器中的唯一标注name用于指定Bean在容器中的名称class用于指定Bean的具体类型,即Bean的全限定类名,让IoC容器要实例化的类scope用于指定Bean的作用域,常见的值有singleton(单例)、prototype(原型)、request(请求)、session(会话)init-method指定Bean初始化时调用的方法destroy-method指定Bean销毁时调用的方法<bean>标签的常用属性<constructor-arg>标签用于设置Bean的构造方法参数,当Bean的类有多个构造方法,或者构造方法需要参数时,可以使用此标签来明确指定要使用的构造方法及其参数。<constructor-arg>标签的常用属性如下。①index:用于指定构造方法的参数索引,参数索引从0开始依次递增1。②type:用于指定构造方法的参数类型。③name:用于指定构造方法的参数名称。④value:用于指定要注入的常量值。⑤ref:用于引用另一个Bean。2.2Bean的配置(1)<constructor-arg>标签2.2Bean的配置(1)<constructor-arg>标签<constructor-arg>标签的使用示例如下。<beanid="person"class="com.itheima.Person">
<constructor-argindex="0"value="张三"/>
<constructor-argindex="1"value="男"/>
<constructor-argname="age"value="30"/>
<constructor-argname="address"
ref="addressBean"/></bean><property>标签用于设置Bean的属性值,对应的Bean需要具有属性相应的getter方法和setter方法。<property>标签的常用属性如下。①name:用于指定属性的名称。②value:用于指定要注入的常量值。③ref:用于指定引用的另一个Bean。2.2Bean的配置(2)<property>标签2.2Bean的配置(2)<property>标签<property>标签的使用示例如下。<beanid="person"class="com.itheima.Person"><propertyname="name"value="张三"/><propertyname="address"ref="addressBean"/></bean>2.2Bean的配置(3)<list>标签<list>标签用于设置Bean中List类型的属性值,通常嵌套在<property>标签中使用,<list>标签中可以包含<value>标签或<ref>标签来指定List集合中的元素值,示例如下。<beanid="person"class="com.itheima.Person"><propertyname="hobbies"><list><value>Reading</value><value>Writing</value><refbean="hobbyBean"/></list></property></bean>2.2Bean的配置(4)<set>标签<set>标签用于设置Bean中Set类型的属性值,其使用方式与<list>类似。2.2Bean的配置(5)<map>标签<map>标签用于设置Bean中Map类型的属性值,Map中每个键值对通过<entry>标签设置,示例如下。<beanid="person"class="com.itheima.Person"><propertyname="OrderInfo"><map><entrykey="id"value="1"/><entrykey="amount"value="100"/></map></property></bean>2.2Bean的配置2.基于注解配置Bean基于XML配置Bean时,需要手动编写大量的XML代码来定义和配置Bean,这使得配置过程变得烦琐且容易出错。同时XML配置文件与代码分离,使得配置信息与代码逻辑不紧密耦合,随着项目规模的扩大,XML配置文件的数量和复杂度也会增加,导致代码的可读性差,维护变得困难。为了解决上述问题,Spring引入了基于注解的方式配置Bean。2.2Bean的配置从Spring2.5开始,开发者可以在Bean的实现类上使用@Component注解或其派生注解(如@Service、@Repository、@Controller等)来标注这些类作为Spring容器管理的Bean。被这些注解标注的类会被视为Spring容器中的一个组件,并由Spring进行管理。当使用注解配置Bean的时候,通常需要在Spring程序的配置文件中配置组件扫描。组件扫描可以指定Spring在什么位置进行扫描,扫描的过程如果发现标记了@Component注解或其派生注解的类后,会将这些类注册为Spring的Bean。在Spring配置文件中,开发者可以通过<context:component-scan>标签指定组件扫描的路径<context:component-scanbase-package="com.itheima"/>2.2Bean的配置3.基于Java类配置Bean基于注解的方式配置Bean可以实现简洁的声明式配置Bean,当如果需要在Bean的初始化过程中调用其他Bean的方法、执行额外的设置步骤等操作时,基于注解的配置方式则显得有些局限。对此,Spring提供了基于Java类的方式配置Bean。基于Java类配置Bean是指通过编写Java类并使用特定的注解来定义和注册Bean,这种方式提供了更加灵活、明确和强大的配置能力,尤其适用于需要复杂逻辑或条件判断的场景。2.2Bean的配置3.基于Java类配置Bean在Spring中提供了@Configuration注解用于将一个Java类标记为配置类,在配置类中定义用于创建和初始化Bean的方法可以实现Bean的定义和配置。配置类中创建和初始化Bean的方法需要返回一个实例对象并在方法上添加@Bean注解标注,这样配置类加载成功后方法返回的实例对象将会由Spring容器管理,Bean的名称默认为方法名。2.2Bean的配置3.基于Java类配置Bean在配置类上可以使用@ComponentScan注解指定加载该配置类时需要扫描的包或者类,示例如下。1@Configuration2@ComponentScan("com.itheima")3publicclassAppConfig{4@Bean5publicMyBeanmyBean(){6returnnewMyBean();7}8}Bean的作用域2.32.3Bean的作用域先定一个小目标!
先定一个小目标!熟悉Bean的作用域,能够简述Bean的5种作用域的特点,以及作用域的配置方式2.3Bean的作用域Spring容器创建一个Bean时,还可以为该Bean指定作用域,Bean的作用域就是指Bean的有效范围。Spring容器为Bean指定了5种作用域,具体如下表所示。作用域说明singletonsingleton(单例)是Spring框架的默认作用域,当将Bean的作用域设置为singleton时,在Spring容器中只会创建一个Bean,该单一的Bean将在整个应用程序的生命周期内被共享prototype当将Bean的作用域设置为prototype(原型)时,每次从容器中请求Bean都会创建一个新的Bean。这意味着每个请求都有自己的Bean,Bean的状态不会在不同的请求之间共享2.3Bean的作用域作用域说明request当将Bean的作用域设置为request(请求)时,在Web应用中,每个HTTP请求都有其自己的Bean,并且该实例仅在当前HTTP请求内有效,这意味着Bean的生命周期与单个HTTP请求的生命周期相同session当将Bean的作用域设置为session(会话)时,在Web应用中,每个HTTP会话都有其自己的Bean,并且该实例仅在当前HTTP会话内有效,这意味着Bean的生命周期与单个HTTP会话的生命周期相同application当将Bean的作用域设置为application(应用)时,在Web应用中,整个Web应用的生命周期内只存在一个Bean,该Bean在整个Web应用中都有效(1)通过XML配置文件设置Bean的作用域2.3Bean的作用域(2)通过注解设置Bean的作用域<beanid="userService"class="com.itheima.UserService"scope="singleton"></bean>@Component@Scope("prototype")publicclassMyBean{}(1)创建项目在IDEA中创建名称为chapter02的Maven项目,并在项目的pom.xml文件中引入Spring框架相关的依赖。2.3Bean的作用域下面通过案例以基于注解的方式设置Bean的singleton作用域和prototype作用域为例,演示Bean作用域的设置和效果。(2)自定义类文件2-1User.java源代码在chapter02项目的src/main/java目录下创建com.itheima.pojo包,并在该包下自定义User类,具体代码如文件2-1所示。2.3Bean的作用域(3)创建配置类文件2-2AppConfig.java源代码在chapter02项目的src/main/java目录下创建com.itheima.config包,并在该包下创建配置类AppConfig,在该配置类定义方法注册Bean,具体代码如文件2-2所示。2.3Bean的作用域(4)定义测试类文件2-3SpringApp.java源代码在chapter02项目的com.itheima文件夹下创建测试类SpringApp,在测试类中定义main()方法,在main()方法中加载AppConfig配置文件初始化IoC容器,并在容器中获取2次User实例进行输出和比较,具体代码如文件2-3所示。2.3Bean的作用域(5)测试效果在IDEA中运行文件2-3,运行结果如下图所示。2.3Bean的作用域(5)测试效果将文件2-2第8行的@Scope("singleton")修改为@Scope("prototype"),再次运行运行文件2-3,运行结果如下图所示。2.3Bean的作用域Bean的实例化2.4在面向对象程序中,如要使用某个对象,就需要先实例化出这个对象。同样地,在Spring中,要想使用容器中的Bean对象,也需要实例化Bean。实例化Bean有3种方式,分别是构造方法实例化、静态工厂实例化、实例工厂实例化。本节将这3种Bean的实例化的方式进行讲解。2.4Bean的实例化2.4.1
构造方法实例化先定一个小目标!
先定一个小目标!掌握构造方法实例化,能够使用构造方法的方式实例化Bean2.4.1
构造方法实例化Spring的构造方法实例化是指在Spring容器启动时,通过调用Bean对应类的构造方法来创建和实例化Bean的过程。默认情况Spring会调用类的无参构造方法实例化Bean,开发者也可以在配置Bean的时候,指定使用类的哪个构造方法实例化Bean。(1)创建配置文件并定义Bean文件2-4applicationContext.xml源代码在chapter02项目的src/main/resources目录下创建applicationContext.xml配置文件,并在applicationContext.xml配置文件中定义Bean,具体代码如文件2-4所示。2.4.1
构造方法实例化下面使用XML配置文件的方式演示基于构造方法实例化Bean。(2)定义测试类文件2-5InstantiationTest.java源代码在chapter02项目的com.itheima文件夹下创建测试类InstantiationTest,在测试类中定义main()方法,在main()方法中加载applicationContext.xml配置文件初始化IoC容器,并在容器中获取User实例进行输出,具体代码如文件2-5所示。2.4.1
构造方法实例化(3)测试效果在IDEA中运行文件2-5,运行结果如下图。2.4.1
构造方法实例化(4)指定Bean的构造方法文件2-6applicationContext.xml源代码User类中包含2个构造方法,下面对指定构造方法的方式配置Bean。修改文件2-4中<bean>标签中Bean的信息,修改后如文件2-6所示。2.4.1
构造方法实例化(5)测试指定构造方法实例化的效果在IDEA中运行文件2-5,运行结果如下图。2.4.1
构造方法实例化2.4.2静态工厂实例化先定一个小目标!
先定一个小目标!掌握静态工厂实例化,能够使用静态工厂的方式实例化Bean2.4.2静态工厂实例化静态工厂是一种创建对象实例的设计模式,它通过在一个类中定义静态方法来生成对象实例。在静态工厂中,用户可以根据需要在方法内部进行逻辑判断,实现定制化的对象创建方式,从而具有更大的灵活性和控制力。另外,静态工厂的设计还能够隐藏对象的具体实现细节,使外部调用者只需要关注如何获取对象实例,而无需了解实现细节。这种封装的特性有助于降低耦合度,提高代码的可维护性和可读性。使用静态工厂方式实例化Bean时,需要开发者定义一个静态工厂类,并在其中编写静态方法来创建Bean的实例。Bean配置文件中的<bean>标签的class属性应该指定的是静态工厂类,使用<bean>标签的factory-method属性指定静态工厂类中用于创建Bean的具体静态方法。(1)定义工厂类文件2-7UserStaticFactory.java源代码在chapter02项目下创建com.itheima.factory包,在该包中创建一个静态工厂类UserStaticFactory,在该类中定义一个静态方法createUser(),用于创建User的实例并返回。UserStaticFactory类的代码如文件2-7所示。2.4.2静态工厂实例化下面通过案例演示如何使用静态工厂方式实例化Bean。(2)配置静态工厂文件2-8applicationContext.xml源代码在chapter02项目的applicationContext.xml文件中使用<bean>标签配置实例化Bean的静态工厂,具体如文件2-8所示。2.4.2静态工厂实例化(3)测试效果在IDEA中运行文件2-5,运行结果如下图所示。2.4.2静态工厂实例化2.4.3实例工厂实例化先定一个小目标!
先定一个小目标!掌握实例工厂实例化,能够使用实例静态工厂的方式实例化Bean2.4.3实例工厂实例化实例工厂是一种创建对象实例的设计模式,特指在工厂模式中使用实例方法(非静态方法)来创建实例的工厂。在实例工厂中,需要先创建工厂实例,然后调用实例方法来动态创建所需的对象实例。与静态工厂相比,实例工厂更加灵活,能够根据具体情况动态创建对象实例。实例工厂创建Bean的过程是通过实例工厂的方法直接实例化Bean,在XML配置文件中,除了使用class属性指定Bean所属的类外,还需要通过factory-bean属性指定配置的实例工厂Bean的名字,factory-method属性指定调用实例工厂中的方法来创建Bean。(1)定义工厂类文件2-9UserInstanceFactory.java源代码在chapter02项目的com.itheima.factory包中创建一个实例工厂类UserInstanceFactory,在该类中定义一个方法createUser(),用于创建User的实例并返回。UserInstanceFactory类的代码如文件2-9所示。2.4.3实例工厂实例化下面通过案例演示如何使用实例工厂方式实例化Bean。(2)配置实例工厂文件2-10applicationContext.xml源代码在chapter02项目的applicationContext.xml文件中使用<bean>标签配置实例化Bean的静态工厂,具体如文件2-10所示。2.4.3实例工厂实例化(3)测试效果在IDEA中运行文件2-5,运行结果如下图所示。2.4.3实例工厂实例化Bean的装配方式2.5Bean的装配是指将应用程序中的各个Bean之间的依赖关系进行正确配置和管理的过程,依赖注入是一种常见的实现Bean装配的方法,通过依赖注入,Spring容器将所需的依赖对象注入Bean中,从而实现Bean之间的解耦和灵活组装。Spring框架常用的Bean装配方式包括基于XML的装配、基于注解的装配和自动装配。本节将对这三种Bean的装配方式进行讲解。2.5Bean的装配方式2.5.1
基于XML的装配先定一个小目标!
先定一个小目标!掌握基于XML的装配,能够基于XML的装配实现Bean的装配2.5.1
基于XML的装配1.属性的setter方法注入XML(ExtensibleMarkupLanguage,可扩展标记语言)是一种标准的数据传输和存储在Spring实例化Bean的过程中,Spring首先会调用Bean对应类的无参构造方法来实例化Bean,然后通过反射的方式调用setter方法来注入属性值。属性setter方法注入要求一个Bean必须满足以下两点要求。①Bean对应的类必须提供一个默认的无参构造方法。②Bean对应的类必须为需要注入的属性提供对应的setter方法。使用属性的setter方法注入时,在Spring配置文件中需要使用在<bean>标签中嵌套<property>标签来为属性注入值2.5.1
基于XML的装配(1)自定义类文件2-11UserDao.java文件2-12
UserService.java源代码在chapter02项目创建com.itheima.dao包和com.itheima.service包,并在这两个包中依次自定义类UserDao和UserService,具体如文件2-11和文件2-12所示。下面通过案例演示基于XML装配Bean时,使用属性的setter方法注入。2.5.1
基于XML的装配(2)编写配置文件文件2-13applicationContext.xml源代码在chapter02项目的applicationContext.xml文件中使用<bean>标签和<property>标签配置Bean和属性注入的信息,具体如文件2-13所示。2.5.1
基于XML的装配(3)编写测试类文件2-14DITest.java源代码在chapter02项目的com.itheima文件夹下创建测试类DITest,在测试类中定义main()方法,在main()方法中加载applicationContext.xml配置文件初始化IoC容器,在容器中获取UserService实例并执行其saveUser()方法,具体代码如文件2-14所示。2.5.1
基于XML的装配(4)测试效果在IDEA中运行文件2-14,运行结果如下图所示。2.5.1
基于XML的装配2.构造方法注入在使用构造方法注入时,在XML配置文件中需要在<bean>标签中使用<constructor-arg>标签来指定构造方法的参数。同时,在被注入的类中需要定义包含被注入Bean的参数的构造方法。这样,在Spring容器实例化Bean时,会根据配置文件中的<constructor-arg>标签设置对应构造方法的参数值,并调用相应的构造方法实例化Bean。2.5.1
基于XML的装配(1)修改UserService类文件2-15UserService.java源代码在UserService类中注释UserDao的setter方法,并添加包含UserDao参数的UserService构造方法,具体如文件2-15所示。下面通过案例演示基于XML装配Bean时,使用构造方法注入。2.5.1
基于XML的装配(2)修改配置文件文件2-16applicationContext.xml源代码在chapter02项目的applicationContext.xml文件中使用<bean>标签和<constructor-arg>标签配置Bean的信息,具体如文件2-16所示。2.5.1
基于XML的装配(3)测试效果在IDEA中运行文件2-14,运行结果如下图所示。2.5.2基于注解的装配和自动装配先定一个小目标!
先定一个小目标!掌握基于注解的装配和自动装配,能够基于注解的装配和自动装配实现Bean的装配2.5.2基于注解的装配和自动装配1.属性的setter方法注入在实际开发中,如果应用程序中存在大量的Bean,通过传统的XML配置方式来进行Bean的装配工作将会导致XML文件变得臃肿,不易维护。为了解决这个问题,Spring提供了基于注解的装配方式。通过使用注解,可以在类和属性上直接标注所需的装配信息,使得配置更加简洁和直观。Spring基于注解的装配是一种依赖注入和Bean配置的方式,通过在类定义和属性上使用特定注解,告诉Spring容器如何实例化这些类为管理的Bean。自动装配是Spring容器根据规则自动识别并注入Bean之间的依赖关系,无需显式声明依赖。基于注解的装配让Spring容器知道如何处理特定类,而自动装配则让Spring容器自动解决Bean之间的依赖关系。两者在功能上有所不同,但通常在实际使用中会结合起来。2.5.2基于注解的装配和自动装配Spring用于装配的常见注解注解描述@Component用于标注类为Spring中的Bean@Controller指定一个控制器组件Bean,功能上等同于@Component@Service指定一个业务逻辑组件Bean,用于将业务逻辑层的类标注为Spring中的Bean,功能上等同于@Component@Repository指定一个数据访问组件Bean,用于将数据访问层的类标注为Spring中的Bean,功能上等同于@Component@Scope指定Bean的作用域@Value指定Bean的注入值2.5.2基于注解的装配和自动装配注解描述@Autowired指定要自动装配的对象@Resource指定要注入的对象@Qualifier指定在自动装配时明确要注入的Bean,通常与@Autowired联合使用@PostConstruct指定Bean完成初始化后调用的方法@PreDestroy指定Bean销毁前调用的方法2.5.2基于注解的装配和自动装配(1)应用在成员变量上@Autowired注解可以应用于类的成员变量、setter方法或构造方法上,以指示Spring容器在初始化Bean时自动注入依赖,示例如下所示。1@Component2publicclassMyComponent{3@Autowired4privateMyServicemyService;5}2.5.2基于注解的装配和自动装配(2)应用在构造方法上1@Component2publicclassMyComponent{3privateMyServicemyService;4@Autowired5publicMyComponent(MyServicemyService){6this.myService=myService;7}8}2.5.2基于注解的装配和自动装配(3)应用在setter方法上1@Component2publicclassMyComponent{3privateMyServicemyService;4@Autowired5publicvoidsetMyService(MyServicemyService){6this.myService=myService;7}8}2.5.2基于注解的装配和自动装配下面通过案例演示基于注解的装配和自动装配实现Bean的装配。(1)使用注解标注UserDao文件2-17UserDao.java源代码在项目chapter02的UserDao类上使用@Repository注解进行标记,让UserDao类在Spring应用程序启动并自动扫描时将其实例化为Bean,并加入Spring容器中,具体代码如文件2-17所示。2.5.2基于注解的装配和自动装配(2)使用注解标注UserService并自动装配UserDao文件2-18UserService.java源代码在项目chapter02的UserService类上使用@Service注解进行标记,让UserService类在Spring应用程序启动并自动扫描时将其实例化为Bean,并注释userDao属性的setter方法,使用@Autowired注解自动注入UserDao对象,具体代码如文件2-18所示。2.5.2基于注解的装配和自动装配(3)编写测试类文件2-19AutowiredTest.java源代码在chapter02项目的com.itheima文件夹下创建测试类AutowiredTest,在测试类中定义main()方法,在main()方法中扫描com.itheima包及其子包初始化IoC容器,在容器中获取UserService实例并执行其saveUser()方法,具体代码如文件2-19所示。2.5.2基于注解的装配和自动装配(4)测试效果在IDEA中运行文件2-19,运行结果如下图所示。Bean的生命周期2.62.6Bean的生命周期先定一个小目标!
先定一个小目标!掌握Bean的生命周期方法的使用,能够定义Bean的初始化方法和销毁方法Bean的生命周期是指Bean从创建到销毁的整个过程。在Spring中,作用域为singleton和prototype的Bean在生命周期管理上有明显的差异。singleton作用域的Bean:Spring容器会完全管理其生命周期,包括创建、初始化和销毁。容器会在启动时创建Bean,并在容器关闭时销毁Bean,确保其生命周期完整。prototype作用域的Bean:Spring容器仅负责创建Bean,不会管理其完整的生命周期,Bean的生命周期和销毁由调用方自行控制的,而不是由Spring容器来管理。2.6Bean的生命周期下面对作用域为singleton的Bean的生命周期进行讲解。在Bean的初始化阶段,由初始化方法负责Bean的初始配置和准备工作;而在Bean的销毁阶段,由销毁方法负责资源释放和清理工作。通过这两个方法,开发人员可以插入自定义逻辑,实现特定的初始化和清理操作,确保Bean在整个生命周期中的正确性和稳定性。2.6Bean的生命周期2.6Bean的生命周期初始化阶段中初始化方法的实现和销毁阶段中销毁方法的实现方式如下。(1)初始化方法的实现①通过<bean>标签的init-method属性实现初始化。在Spring的XML配置文件中,开发者通过<bean>标签的init-method属性指定初始化方法的名称,Spring容器在实例化并注入属性后,会调用这个方法,示例如下。<beanid="userDao"class="com.itheima.UserDao"init-method="init"/>2.6Bean的生命周期②通过@Bean注解的initMethod属性实现初始化。当使用Java配置类定义Bean时,开发者可以通过@Bean注解的initMethod属性指定初始化方法,示例如下。1@Configuration2publicclassAppConfig{3@Bean(initMethod="init")4publicMyBeanmyBean(){5returnnewMyBean();6}7}2.6Bean的生命周期③通过重写InitializingBean接口的afterPropertiesSet()方法实现。任何类实现InitializingBean接口,并重写其中的afterPropertiesSet()方法后,该方法会在Bean化完成后被调用,从而实现初始化逻辑,示例如下。1publicclassExampleBeanimplementsInitializingBean{2@Override3publicvoidafterPropertiesSet()throwsException{4//初始化的逻辑代码5}6}2.6Bean的生命周期④通过@PostConstruct注解实现。@PostConstruct注解是JSR250(JavaSpecificationRequest250,Java规范请求250)为Java预定义的注解之一,它是用于在依赖注入完成后执行初始化方法的一个注解,示例如下。1publicclassExampleBean{2@PostConstruct3publicvoidinit(){4//初始化的逻辑代码5}6}2.6Bean的生命周期(2)销毁方法的实现①通过<bean>标签的destroy-method属性实现。在Spring的XML配置文件中,开发者通过<bean>标签的destroy-method属性指定销毁方法的名称,应用程序在Bean销毁之前会调用这个方法,示例如下。<beanid="userDao"class="com.itheima.UserDao"destroy-method="destroy"/>2.6Bean的生命周期②通过@Bean注解的destroyMethod属性实现。当使用Java配置类定义Bean时,开发者可以通过@Bean注解的destroyMethod属性指定销毁方法,示例如下。1@Configuration2publicclassAppConfig{3@Bean(destroyMethod="destroy")4publicMyBeanmyBean(){5returnnewMyBean();6}7}2.6Bean的生命周期③通过重写DisposableBean接口的destroy()方法实现。Spring提供了一个名为DisposableBean的接口,该接口定义了一个名为destroy的方法。任何类实现DisposableBean接口,并重写其中的destroy()方法后,该方法会在Bean销毁被调用,示例如下。1publicclassExampleBeanimplementsDisposableBean{2@Override3publicvoiddestroy()throwsException{4//销毁前的逻辑代码5}6}2.6Bean的生命周期④通过@PreDestroy注解实现。@PreDestroy注解是JSR250(JavaSpecificationRequest250,Java规范请求250)为Java预定义的注解之一,用于标记Bean的销毁方法,被该注解标注的方法会在Bean销毁之前执行,示例如下。1publicclassExampleBean{2@PreDestroy3publicvoiddestroy(){4//销毁前的逻辑代码5}6}2.6Bean的生命周期下面通过案例演示作用域为singleton的Bean初始化方法和销毁方法的使用。(1)引入依赖本案例基于@PostConstruct注解和@PreDestroy注解定义初始化方法和销毁方法,对此需要在项目的pom.xml文件中引入Java注解的依赖,具体如下。1<dependency>2 <groupId>javax.annotation</groupId>3 <artifactId>javax.annotation-api</artifactId>4 <version>1.3.2</version>5</dependency>2.6Bean的生命周期(2)创建自定义类文件2-20DataInfo.java源代码在项目chapter02的com.itheima.pojo包下创建自定义类DataInfo,在该类上使用@Component注解标注当前类创建的Bean交于Spring容器管理,并在该类中定义类的构造方法、Bean的初始化方法、Bean的销毁方法,具体代码如文件2-20所示。2.6Bean的生命周期(3)编写测试类文件2-21LifecycleTest.java源代码在chapter02项目的com.itheima文件夹下创建测试类LifecycleTest,在测试类中定义main()方法,在main()方法中扫描com.itheima包及其子包初始化IoC容器,在容器中获取DataInfo实例后,使用AbstractApplicationContext的registerShutdownHook()方法关闭Spring应用程序上下文,具体代码如文件2-21所示。2.6Bean的生命周期(4)测试效果在IDEA中运行文件2-21,运行结果如下图所示。本章小结本章主要讲解了Spring对Bean的管理。首先介绍了Spring的IoC容器;接着讲解了Bean的配置和Bean的作用域;然后讲解了Bean的实例化和Bean的装配方式;最后讲解了Bean的生命周期。通过本章的学习,读者可以对Spring中Bean的管理有基本的了解,为以后框架开发奠定基础。本章小结第3章SpringAOP《JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)(第3版)》学习目标/Target了解AOP的概念,能够简述AOP的优点熟悉JDK动态代理,并实现JDK动态代理的案例熟悉CGLIB动态代理,并实现CGLIB动态代理的案例掌握基于XML的AOP实现掌握基于注解的AOP实现章节概述/Summary在JavaEE应用程序开发中,经常需要处理横跨多个模块的功能需求,这些需求并非业务逻辑,而是涉及应用程序运行环境和共性方面的问题,如日志记录、安全控制、事务管理和性能监控等。如果在每个模块中都重复实现这些功能,会导致代码冗余、可维护性降低等问题。为了解决这些问题,开发者可以利用Spring框架的AOP来管理和复用这些通用的横切关注点,从而提高代码的可重用性和可维护性。本章将对SpringAOP的相关知识进行讲解。目录/Contents3.13.2AOP概述SpringAOP的实现机制3.3SpringAOP集成AspectJ的实现AOP概述3.13.1
AOP概述先定一个小目标!
先定一个小目标!了解AOP的概念,能够简述AOP的优点AOP的全称是AspectOrientedProgramming,即面向切面编程,它是一种编程方法论,是OOP(ObjectOrientedProgramming,面向对象编程)的一种补充。AOP可以通过将业务逻辑与横切关注点(如安全控制、日志记录等在多个模块或组件中共同存在的功能)分离,从而实现更好的代码模块化、可维护性和可复用性。在SpringAOP中,开发者可以通过定义切面(Aspect)来实现这种分离,并通过在运行时动态地将切面织入(Weave)到业务逻辑中,实现将横切关注点应用于多个组件、对象或方法中,避免了代码的重复和低效性。3.1
AOP概述3.1
AOP概述类与切面的关系3.1
AOP概述AOP的常用术语如下。1.切面:切面(Aspect)是用于横向划分关注点的模块化单元,通常用于封装横向插入系统的功能。2.连接点:连接点(Joinpoint)是程序执行过程中的特定节点,一个连接点通常代表一个方法的执行。3.切点:切点(Pointcut)是指程序执行过程中满足预先指定条件的连接点。4.通知:通知(Advice)是切面中的实际代码,用于实现切面的具体功能。5.目标对象:目标对象(TargetObject)指的是被切面增强的原始对象。6.织入:织入(Weaving)是指将切面代码插入到目标对象上,从而生成代理对象的过程。7.代理对象:代理对象(ProxyObject)是织入切面后创建的对象,用于应用通知到目标对象。8.引介:引介(Introduction)是一种特殊的通知,用于为目标对象添加新的属性和方法。SpringAOP的实现机制3.23.2SpringAOP的实现机制Spring框架中实现AOP时,应用程序在运行期会为目标对象生成一个动态代理对象,并在代理对象中实现对目标对象的增强。根据代理对象的创建方式,可以将AOP实现机制分为JDK动态代理和CGLIB动态代理,本节将针对这两种实现机制进行讲解。3.2.1
JDK动态代理先定一个小目标!
先定一个小目标!熟悉JDK动态代理,并实现JDK动态代理的案例AOP中的JDK动态代理是一种基于接口的代理方式,即只能为接口创建代理实例。JDK动态代理是SpringAOP的默认的动态代理机制,它利用Java反射机制在运行时动态地创建目标对象的代理对象,并将通知与代理对象关联起来,从而实现对目标对象的增强。JDK动态代理使用Java中的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象。首先需要定义一个InvocationHandler实现类,它包含一个invoke()方法,该方法中定义了增强的逻辑。然后通过Proxy类的newProxyInstance()方法创建代理对象,该方法通过接收类加载器、代理实现的接口以及InvocationHandler对象来生成代理对象。3.2.1
JDK动态代理3.2.1
JDK动态代理(1)创建项目并依赖在IDEA中创建一个名为chapter03的Maven项目,然后在项目的pom.xml文件中引入Spring的核心依赖。下面通过一个案例演示Spring中JDK动态代理的实现过程。3.2.1
JDK动态代理(2)创建接口和实现类文件3-1
UserDao.java文件3-2
UserDaoImpl.java源代码在chapter03项目下创建com.itheima.dao包,在该包下创建接口UserDao,在该接口中编写添加和删除的方法。在com.itheima.dao包下创建UserDao接口的实现类UserDaoImpl,在重写接口的方法中添加一条输出语句,具体如文件3-1和文件3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 相亲买入婚姻合同范本
- 2025年水运工程助理试验检测师资格考试(公共基础)经典试题及答案一
- 2025年公路工程试验检测师资格考试(桥梁隧道工程)经典试题及答案一
- 南京各区初二下数学试卷
- 广告机采购合同范本
- 出售转让焊机合同范本
- 2025年交通运输安全管理工作总结
- 汽油货车出租合同范本
- 全国卷23年高考数学试卷
- 采购模具材料合同范本
- 河南省安阳市文峰区2024-2025学年八年级上学期期末语文试题(原卷版+解析版)
- 以数独为代表的逻辑思维游戏教学研究
- 2024-2025学年广东省河源市小升初分班考试数学试卷(附答案解析)
- 《中国现代农业发展》课件
- 交通运输概论教学教案
- 餐饮业的舆情管理
- 台达DELTA变频器VFD-EL系列使用说明书和手册(完整中文版)VFD007EL23A
- 产品研发流程指南
- 2024年银行从业资格考试题和答案历年真题公司信贷篇
- 2024-2025学年外研版八年级英语上学期期末复习 专题05 首字母填空(20篇) 【考题猜想】
- 除颤仪的使用方法及操作流程课件
评论
0/150
提交评论