豪车网站建设背景,wordpress 获取页面的名称,广元做网站站排名,绿韵建设有限公司网站目录 Spring框架前言 服务端三层开发表现层业务层持久层 Spring框架的概述Spring框架的优点Spring核心——IoC什么是IoC#xff1f;O.o什么是耦合度#xff1f; 创建第一个IoC程序导入必要依赖编写接口和实现类编写Spring核心配置文件测试类进行测试 Spring配置文件Bean对象的… 目录 Spring框架前言 服务端三层开发表现层业务层持久层 Spring框架的概述Spring框架的优点Spring核心——IoC什么是IoCO.o什么是耦合度 创建第一个IoC程序导入必要依赖编写接口和实现类编写Spring核心配置文件测试类进行测试 Spring配置文件Bean对象的创建和销毁的两个属性配置 实例化Bean对象的三种方式DI依赖注入属性的set方法注入值属性构造方法方式注入值数组集合(List,Set,Map)Properties等的注入 多配置文件的加载方式主配置文件中直接添加工厂创建的时候直接加载多个配置文件 Spring框架
前言 服务端三层开发
表现层
表现层负责处理用户界面和用户交互。它接收用户的请求进行初步处理后转发给业务层并将业务层返回的数据呈现给用户。常见的表现层技术包括 Web 框架如 Spring MVC、Struts、前端框架如 React、Vue.js等。
ServletSpringMVCStruts
业务层
业务层是系统的逻辑核心负责处理业务规则和业务流程。它接收来自表现层的请求调用持久层进行数据操作并返回处理结果给表现层。业务层通常包含服务类和服务接口实现复杂的业务逻辑和事务管理。常见的业务层技术包括 Spring、Hibernate 等。
serviceSpring
持久层
持久层负责数据的存储和检索主要与数据库进行交互。它提供了数据访问对象DAO或仓库Repository来封装数据访问逻辑确保数据的一致性和完整性。持久层通常使用 ORM对象关系映射框架如 Hibernate、MyBatis来简化数据库操作。
JDBCMyBatisJDBC Template
Spring框架的概述
Spring是一个开放源代码的设计层面框架它解决的是业务逻辑层和其他各层的松耦合问题因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一个轻量级的Java 开发框架由Rod Johnson创建。简单来说Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
Spring是于2003 年兴起的一个轻量级的Java开发框架由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构分层架构允许使用者选择使用哪一个组件同时为 J2EE 应用程序开发提供集成的框架。
Spring的核心是控制反转IoC控制反转和面向切面AOP。简单来说Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
Spring框架的优点 方便解耦简化开发Spring就是一个大工厂可以将所有对象创建和依赖关系维护交给Spring管理。 AOP编程的支持Spring提供面向切面编程可以方便的实现对程序进行权限拦截、运行监控等功能。可扩展性 声明式事务的支持只需要通过配置就可以完成对事务的管理而无需手动编程。 方便程序的测试Spring对Junit4支持可以通过注解方便的测试Spring程序。 方便集成各种优秀框架Spring不排斥各种优秀的开源框架其内部提供了对各种优秀框架如Struts2、Hibernate、MyBatis、Quartz等的直接支持。 降低JavaEE API的使用难度Spring 对JavaEE开发中非常难用的一些APIJDBC、JavaMail、远程调用等都提供了封装使这些API应用难度大大降低。
Spring核心——IoC
什么是IoCO.o
IOC——Inverse of Control控制反转将对象的创建权力反转给Spring框架
控制反转Inversion of Control缩写为IoC是面向对象编程中的一种设计原则可以用来减低计算机代码之间的耦合度。如下图来自百度百科 那么涉及到第二个问题
什么是耦合度
可以看看这篇文章聊聊什么是耦合度-CSDN博客简而言之就是各个对象或者类或者是模块之间的依赖程度然而我们并不希望我们的程序是一个高耦合度的程序因为这样各个模块之间紧密相连会导致可扩展性、可维护性变差。
我们希望我们的程序是低耦合高内聚的程序也就是模块内部的元素依赖关系紧密而模块之间并不存在很紧密的依赖关系高内聚度的模块会使得代码更加清晰、易于理解和维护同时可以提高代码的复用性。
创建第一个IoC程序
这里还是说一下我用到的工具
IDEIntelliJ IDEA 2024.2.3Maven3.9.8
导入必要依赖
dependencies!-- Spring核心 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.2.RELEASE/version/dependency!-- 日志接口 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependency!-- 日志核心 --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.12/version/dependency!-- JUnit测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency
/dependencies编写接口和实现类
// 接口类
public interface UserService {public void hello();
}// 实现类
public class UserServiceImpl implements UserService {Overridepublic void hello() {System.out.println(Hello IOC!!!);}
}编写Spring核心配置文件
在src目录下创建applicationContext.xml的配置文件名称是可以任意的但是一般都会使用默认名称。我们通过这个配置文件来实现我们IoC的核心操作
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!--IOC管理bean--!--一个bean相当于一个对象bean的意义是将该类的创建对象的权利授予spring容器让spring容器来创建对象--bean iduserService classcom.qcby.service.Impl.UserServiceImpl /
/beans前面我们提到Spring设计核心就是IoC这里配置文件中就是在由我们的IoC容器创建对象我们将由IoC容器管理的Java对象称为Spring Bean我们可以在编译器的对应的类文件中看到一个小咖啡豆的标志 测试类进行测试
下面我们写一个最简单的测试方法来测试我们写好的UserServiceImpl实现类 Testpublic void run1(){// 使用Spring的工厂ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);// 通过工厂获得类:UserService userService (UserService) applicationContext.getBean(userService);userService.hello();}输出结果 这里简单穿插一条题外话Spring的默认设计模式是单例模式——单例模式Singleton保证一个类仅有一个实例并提供一个访问它的全局访问点。感兴趣的可以看看这篇文章一文带你彻底搞懂设计模式之单例模式由浅入深图文并茂超超超详细的单例模式讲解-CSDN博客介绍的很详细不再过多介绍。 Spring配置文件 id属性Bean起个名字在约束中采用ID的约束唯一取值要求必须以字母开始可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符。 class属性Bean对象的全路径。 scope属性scope属性代表Bean的作用范围其中的属性值如下 取值范围说明singleton默认值单例模式prototype多例模式requestWEB 项目中Spring 创建一个 Bean 的对象将对象存入到 request 域中sessionWEB 项目中Spring 创建一个 Bean 的对象将对象存入到 session 域中global sessionWEB 项目中应用在 Portlet 环境如果没有 Portlet 环境那么globalSession 相当于 session
Bean对象的创建和销毁的两个属性配置
说明Spring初始化bean或销毁bean时有时需要作一些处理工作因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法 init-method标签当bean被载入到容器的时候调用init-method属性指定的方法 destroy-method标签当bean从容器中删除的时候调用destroy-method属性指定的方法
实例化Bean对象的三种方式 默认是无参数的构造方法默认方式基本上使用 bean iduserService classcom.qcby.service.Impl.UserServiceImpl /静态工厂实例化方式 /*** 静态工厂方式*/
public class StaticFactory {// 静态工厂方式public static UserService createUs(){System.out.println(通过静态工厂的方式创建UserServiceImpl对象...);// 编写很多业务逻辑 权限校验return new UserServiceImpl();}}bean idus classcom.qcby.demo1.StaticFactory factory-methodcreateUs / 实例工厂实例化方式因为类中的方法非静态所以需要先实例化类再去创建对象因此得名说实话这个一开始还真没注意到 /*** 动态工厂方式*/
public class Dfactory {public UserService createUs(){System.out.println(实例化工厂的方式...);return new UserServiceImpl();}}bean iddfactory classcn.tx.demo1.Dfactory /
bean idus factory-beandfactory factory-methodcreateUs /DI依赖注入
依赖注入(Dependency Injection)是在Spring框架负责创建Bean对象时动态的将依赖对象注入到Bean组件中这么说可能有点难懂可以理解为你的类中有很多属性比如name、age等我们需要给这些属性赋值但是我们又不想通过调用构造器或者是调用setter()方法去赋值这时我们就可以用DI来给这些属性赋值或者是创建依赖对象。
**依赖注入是实现控制反转的一种常见方式。**目的是处理依赖于对象的关系
属性的set方法注入值
编写实现类其中包括要实现的对象或属性最后通过配置文件调用setter()方法进行注入:
// 实现类
public class OrderServiceImpl implements OrderService {// 编写成员属性一定需要提供该属性的set方法private OrderDao orderDao;// 一定需要提供该属性的set方法IOC容器底层就通过属性的set方法方式注入值public void setOrderDao(OrderDao orderDao) {this.orderDao orderDao;}private String name;private Integer age;public void setName(String name) {this.name name;}public void setAge(Integer age) {this.age age;}Overridepublic void saveOrder() {System.out.println(业务层保存订单姓名 name -年龄 age);orderDao.saveOrder();}
}public class OrderDaoImpl implements OrderDao {Overridepublic void saveOrder() {System.out.println(持久层保存订单...);}}编写配置文件
!--DI依赖注入--
bean idorderService classcom.qcby.service.Impl.OrderServiceImpl!-- 将实例化的对象注入到orderDao --property nameorderDao reforderDao /property namename valueRay /property nameage value23 /
/bean
!-- 这里先将OrderDaoImpl实例化再注入到orderService中 --
bean idorderDao classcom.qcby.DAO.Impl.OrderDaoImpl/bean idorderDao classcom.qcby.DAO.Impl.OrderDaoImpl/这条语句其实就是创建对象并在property nameorderDao reforderDao /这里将对象用orderDao接口接收
编写测试方法
Test
public void run2(){// 使用Spring的工厂ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);// 通过工厂获得类:OrderService orderService (OrderService) applicationContext.getBean(orderService);orderService.saveOrder();
}属性构造方法方式注入值
编写类以及对应的带参的构造方法
public class Car {// 名称private String cname;// 金额private Double cmoney;public Car(String cname, Double cmoney) {this.cname cname;this.cmoney cmoney;}Overridepublic String toString() {return Car{ cname cname \ , cmoney cmoney };}
}编写配置文件注入属性值
bean idcar classcom.qcby.Demo.Carconstructor-arg namecname valuePorsche/constructor-arg namecmoney value40000000 /
/bean测试
Test
public void run3(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);Car car (Car) applicationContext.getBean(car);System.out.println(car.toString());
}数组集合(List,Set,Map)Properties等的注入
编写实现类实现对应属性
public class CollectionBean {// 数组private String [] strs;public void setStrs(String[] strs) {this.strs strs;}private ListString list;public void setList(ListString list) {this.list list;}private MapString,String map;public void setMap(MapString, String map) {this.map map;}private Properties properties;public void setProperties(Properties properties) {this.properties properties;}Overridepublic String toString() {return CollectionBean{ strs Arrays.toString(strs) , list list , map map , properties properties };}
}编写配置文件注入值
!--给集合属性注入值--
bean idcollectionBean classcom.qcby.Demo.CollectionBeanproperty namestrsarrayvalue美美/valuevalue小凤/value/array/propertyproperty namelistlistvalue熊大/valuevalue熊二/value/list/propertyproperty namemapmapentry keyaaa value老王/entry keybbb value小王//map/propertyproperty namepropertiespropsprop keyusernameroot/propprop keypassword123456/prop/props/property
/bean编写测试方法
Test
public void run4(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);CollectionBean collectionBean (CollectionBean) applicationContext.getBean(collectionBean);System.out.println(collectionBean.toString());
}多配置文件的加载方式
一共两种方式
主配置文件中直接添加
import resourceapplicationContext2.xml/工厂创建的时候直接加载多个配置文件
ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml,applicationContext2.xml);