东鹏拼奖网站怎么做,淄博展厅设计公司,wordpress博客模板下载,合肥网站营销文章目录 一、Spring、Spring boot、Spring MVC之间的区别1. Spring 是什么2. 区别概述 一、Spring、Spring boot、Spring MVC之间的区别
1. Spring 是什么 Spring 是包含了众多工具方法的 IoC 容器 #xff08;1#xff09;容器
容器是用来容纳某种物品的基本装置#xf… 文章目录 一、Spring、Spring boot、Spring MVC之间的区别1. Spring 是什么2. 区别概述 一、Spring、Spring boot、Spring MVC之间的区别
1. Spring 是什么 Spring 是包含了众多工具方法的 IoC 容器 1容器
容器是用来容纳某种物品的基本装置比如List/Map就是数据存储容器Tomcat就是Web容器
2loC
1. 概述
loCInversion if Control控制反转也就是说Spring 是一个“控制反转”的容器是 Spring 的核心思想
eg. 在类上添加RestController 和 Controller 注解就是把这个对象交给 Spring管理Spring 框架启动时就会加载该类即实现了把对象交给Spring管理 这部分代码就是loC容器做的事
IoC容器的优点 资源不由使用资源的双方管理而由不使用资源的第三方管理这可以带来很多好处。第一资源集中管理实现资源的可配置和易管理。第二降低了使用资源双方的依赖程度也就是我们说的耦合度。
资源集中管理: IoC容器会帮我们管理一些资源(对象等)我们需要使用时, 只需要从IoC容器中去取就可以了我们在创建实例的时候不需要了解其中的细节, 降低了使用资源双方的依赖程度, 也就是耦合度
代码方面理解把材料外包出去不自己制造
2. 使用
【1】Bean的存储 Spring 是一个loC容器而作为容器那【存】和【取】的功能就是最基本的。 Spring 容器 管理的主要是对象这些对象, 我们称之为Bean。我们把这些对象交由Spring管理, 由Spring来负责对象的创建和销毁. 我们程序只需要告诉Spring哪些需要存以及如何从Spring中取出对象 对于 Spring 框架而言共有两类注解可以将某个对象交给loC容器管理
类注解Controller、Service、Repository、Component、Configuration方法注解Bean
Bean 的 名称Spring bean 是Spring框架在运行时管理的对象Spring 会给管理的对象起一个名字而根据这个名称BeanId就可以获取到对应的对象
Bean的命名约定程序开发人员不需要为bean指定名称(BeanId), 如果没有显式的提供名称(BeanId)Spring容器将为该bean生成唯⼀的名称 命名约定使用Java标准约定作为实例字段名. 也就是说bean名称以小写字母开头然后使用驼峰式大小写 类名: UserController, Bean的名称为userController类名: AccountManager, Bean的名称为accountManager 也有⼀些特殊情况, 当有多个字符并且第⼀个和第⼆个字符都是大写时, 将保留原始的大小写 类名: UController, Bean的名称为UController类名: AManager, Bean的名称为AManager Controller控制器存储
Controller
public class UserController {public void sayHi(){System.out.println(这是UserController);}
}SpringBootApplication
public class demo {public static void main(String[] args) {//获取Spring上下文对象ApplicationContext context SpringApplication.run(demo.class, args);//从上下文中获取对象,下面是三种不同的获取方式//根据类的类型获取UserController userController1 context.getBean(UserController.class);//根据名称获取需要强转UserController userController2 (UserController) context.getBean(userController);//根据名称和类型获取不需要强转UserController userController3 context.getBean(userController, UserController.class);System.out.println(userController1);System.out.println(userController2);System.out.println(userController3);}}获取bean对象, 是父类BeanFactory提供的功能 ApplicationContext VS BeanFactory常见面试题 继承关系和功能方面来说Spring 容器有两个顶级的接口BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能力而ApplicationContext 属于 BeanFactory 的子类它除了继承了 BeanFactory 的所有功能之外它还拥有独特的特性还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。从性能方面来说ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象而 BeanFactory 是需要那个才去加载那个因此更加轻量。(空间换时间)
Service服务存储
Service
public class UserService {public void sayHi(){System.out.println(这是UserService);}
}SpringBootApplication
public class demo {public static void main(String[] args) {//获取Spring上下文对象ApplicationContext context SpringApplication.run(demo.class, args);UserService service context.getBean(UserService.class);service.sayHi();}}Repository仓库存储、Configuration配置存储、Component组件存储的操作与上述都类似只需要更改注解
SpringBootApplication
public class SpringIocDemoApplication {public static void main(String[] args) {//获取Spring上下⽂对象ApplicationContext context SpringApplication.run(SpringIocDemoApplicatio//从Spring上下⽂中获取对象UserConfiguration userConfiguration context.getBean(UserConfiguration.cl//使⽤对象userConfiguration.sayHi();}
}为什么需要这么多的注解 让程序员看到类注解之后就能直接了解当前类的用途 Controller控制层, 接收请求, 对请求进行处理, 并进行响应Servie业务逻辑层, 处理具体的业务逻辑Repository数据访问层也称为持久层. 负责数据访问操作Configuration配置层. 处理项目中的⼀些配置信息
应用分层的调用逻辑 方法注解 Bean
类注解是添加到某个类上的 但是存在两个问题:
使用外部包里的类, 没办法添加类注解⼀个类, 需要多个对象比如多个数据源 这种场景, 我们就需要使用方法注解 BeanBean 注解的bean, bean的名称就是它的方法名
使用时的注意点
在 Spring 框架的设计中方法注解 Bean 要配合类注解才能将对象正常的存储到 Spring 容器中bean想要生效还需要被Spring扫描 通过 ComponentScan 来配置扫描路径有时候 ComponentScan 注解虽然没有显式配置但是实际上已经包含在了启动类声明注解SpringBootApplication 中了。默认扫描的范围是SpringBoot启动类所在包及其子包
Configuration
public class BeanConfig {Beanpublic UserInfo userInfo(){UserInfo user new UserInfo();user.setName(zhangsan);user.setAge(18);return user;}
}
定义多个对象
Configuration
public class BeanConfig {Beanpublic UserInfo userInfo1(){UserInfo user new UserInfo();user.setName(zhangsan);user.setAge(18);return user;}Beanpublic UserInfo userInfo2(){UserInfo user new UserInfo();user.setName(lisi);user.setAge(22);return user;}
}SpringBootApplication
public class St20231205Application {public static void main(String[] args) {//根据名称获取Bean对象UserInfo userInfo1 (UserInfo) context.getBean(userInfo1);UserInfo userInfo2 (UserInfo) context.getBean(userInfo2);System.out.println(userInfo1);System.out.println(userInfo2);}}重命名Bean
Bean(name {u1,user1})
public User user1(){User user new User();user.setName(zhangsan);user.setAge(18);return user;
}SpringBootApplication
public class SpringIocDemoApplication {public static void main(String[] args) {//获取Spring上下⽂对象ApplicationContext context SpringApplication.run(SpringIocDemoApplicatio//从Spring上下⽂中获取对象User u1 (User) context.getBean(u1);//使⽤对象System.out.println(u1);}
}name{} 可以省略如下代码所示如 Bean({“u1”,“user1”}) public User user1(){ User user new User(); user.setName(“zhangsan”); user.setAge(18); return user; } 只有⼀个名称时, {}也可以省略, 如: Bean(“u1”) public User user1(){ User user new User(); user.setName(“zhangsan”); user.setAge(18); return user; } 3DI
1. 概述
DI: Dependency Injection(依赖注入)即容器在运行期间, 动态的为应用程序提供运行时所依赖的资源如果程序运行时需要某个资源对象此时容器就为其提供这个资源。
所以DI 和 loC是从不同的角度去描述同一件事情即都是通过引入loC容器利用依赖关系注入的方式实现对象之间的解耦。loC是一种思想而DI是loC的一种具体实现
依赖注入是⼀个过程是指IoC容器在创建Bean时, 去提供运行时所依赖的资源而资源指的就是对象
2. 使用
关于依赖注入Spring也给我们提供了三种方式
属性注入(Field Injection)构造方法注入(Constructor Injection)Setter 注入(Setter Injection)
1属性注入 属性注入是使用 Autowired 实现的将 Service 类注入到 Controller 类中 Controller
public class UserController {Autowiredprivate UserService userService;public void sayHi() {System.out.println(Hi,UserController);userService.sayHi();}}Service
public class UserService {public void sayHi() {System.out.println(HiUserService);}
}SpringBootApplication
public class demo {public static void main(String[] args) {ApplicationContext context SpringApplication.run(demo.class, args);UserController userController (UserController)context.getBean(userController);userController.sayHi();}}2构造方法注入
Controller
public class UserController2 {private UserService userService;Autowiredpublic UserController2(UserService userService){this.userService userService;}public void sayHi() {System.out.println(Hi,UserController2);userService.sayHi();}
}3Setter注入
Controller
public class UserController3 {//注⼊⽅法3: Setter⽅法注⼊private UserService userService;Autowiredpublic void setUserService(UserService userService) {this.userService userService;}public void sayHi(){System.out.println(hi,UserController3...);userService.sayHi();}
}4三种注入优缺点分析
属性注入 优点: 简洁使用方便缺点: 只能用于 IoC 容器如果是非 IoC 容器不可用并且只有在使用的时候才会出现 NPE空指针异常不能注入⼀个Final修饰的属性 构造函数注⼊(Spring 4.X推荐) 优点: 可以注入final修饰的属性注入的对象不会被修改依赖对象在使用前⼀定会被完全初始化因为依赖是在类的构造方法中执行的而构造方法是在类加载阶段就会执行的方法通用性好, 构造方法是JDK支持的, 所以更换任何框架,他都是适用的 缺点: 注入多个对象时, 代码会比较繁琐 Setter注入(Spring 3.X推荐) 优点: 方便在类实例之后, 重新对该对象进行配置或者注入缺点: 不能注入⼀个Final修饰的属性注入对象可能会被改变, 因为setter方法可能会被多次调用, 就有被修改的风险
4Autowired存在问题 当同⼀类型存在多个bean时使用Autowired会存在问题。 解决方法
Primary确定默认的实现
Component
public class BeanConfig {Primary //指定该bean为默认bean的实现Bean(u1)public User user1(){User user new User();user.setName(zhangsan);user.setAge(18);return user;}Beanpublic User user2() {User user new User();user.setName(lisi);user.setAge(19);return user;}
}Qualifier指定当前要注入的bean对象。Qualifier注解不能单独使用必须配合Autowired使用 java
Controller
public class UserController {Qualifier(user2) //指定bean名称Autowiredprivate User user;public void sayHi(){System.out.println(hi,UserController...);System.out.println(user);}
}Resource按照bean的名称进行注入。通过name属性指定要注⼊的bean的名称
Controller
public class UserController {Resource(name user2)private User user;public void sayHi(){System.out.println(hi,UserController...);System.out.println(user);}
}Autowird 与 Resource的区别 Autowired 是spring框架提供的注解⽽Resource是JDK提供的注解Autowired 默认是按照类型注入而Resource是按照名称注⼊. 相比于 Autowired 来说Resource 支持更多的参数设置例如 name 设置根据名称获取 Bean 2. 区别概述
Spring简单来说Spring 是⼀个开发应用框架什么样的框架呢有这么几个标签轻量级、⼀站式、模块化其目的是用于简化企业级应用程序开发 Spring的主要功能: 管理对象以及对象之间的依赖关系, ⾯向切⾯编程, 数据库事务管理, 数据访问web框架支持等 但是Spring具备高度可开放性, 并不强制依赖Spring, 开发者可以自由选择Spring的部分或者全 部Spring可以无缝继承第三方框架比如数据访问框架(Hibernate 、JPA)web框架(如Struts、JSF) Spring MVCSpring MVC是Spring的⼀个子框架, Spring诞生之后⼤家觉得很好用于是按照MVC模式设计了⼀个 MVC框架(一些用Spring 解耦的组件), 主要用于开发WEB应用和网络接口所以Spring MVC 是⼀个Web框架 Spring MVC基于Spring进行开发的, 天生的与Spring框架集成. 可以让我们更简洁的进行Web层开发, 支持灵活的 URL 到页面控制器的映射, 提供了强大的约定大于配置的契约式编程支持, 非常容易与其他视图框架集成如 Velocity、FreeMarker等 Spring BootSpring Boot是对Spring的⼀个封装, 为了简化Spring应用的开发而出现的中小型企业没有成本研究自己的框架, 使用Spring Boot 可以更加快速的搭建框架, 降级开发成本, 让开发人员更加专注于Spring应用的开发而无需过多关注XML的配置和⼀些底层的实现 Spring Boot 是个脚⼿架, 插拔式搭建项目, 可以快速的集成其他框架进来 Spring MVC和Spring Boot都属于SpringSpring MVC 是基于Spring的⼀个MVC 框架⽽Spring Boot 是基于Spring的⼀套快速开发整合包