JAVA Spring学习Day1

news2024/9/20 1:11:35

Maven

Maven配置:

Maven是Java项目的构建工具,使用pom.xml配置文件管理项目依赖、插件和构建目标。
Spring Boot项目搭建:

Spring Boot是基于Spring框架的快速开发框架,通过约定大于配置的理念简化了Spring应用的搭建和开发。

Spring

项目启动:

package com.easy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EasySpringAApplication {
    //项目启动类
    //运行起该类就运行了整个项目
    public static void main(String[] args) {
        SpringApplication.run(EasySpringAApplication.class,args);
    }
}

Spring核心概念
IOC控制反转:

控制反转是Spring的核心,它通过依赖注入(DI)实现,将对象的创建和管理交由Spring容器负责,降低了组件之间的耦合度。Spring提供了IOC的方式,方便获取该对象。容器和代码之间的控制权反转,代码中不需要明文调用方法来得到对象,只需要声明该类需要什么类型的对象即可。

package com.easy.service;

import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;

@Service
public class EasyService {
    //Spring IOC
    //管理项目中java bean的生命周期

    //在项目运行阶段,程序中需要很多的对象来完成整体的业务

    //springboot提供了很多注解标注类,
    //@Controller @RestController(访问层) @Repository(Dao数据访问) @Component(其他功能类) @Bean @Service(业务类)
    //让spring管理这些类的对象的生命周期
    //Spring提供了IOC的方式,方便获取该对象
    //IOC==控制反转
    //容器和代码之间的控制权反转,代码中不需要明文调用方法来得到对象,只需要声明该类需要什么类型的对象即可

    //@Service注解是不能代替@Controller
    @RequestMapping("easyaa")
    public String easyaa(){
        return "this is aa";
    }//访问不到404

}


DI依赖注入:

依赖注入是IOC的具体实现方式,通过注入对象所需的依赖关系,实现了组件之间的解耦和灵活性。

package com.easy.controller;

import com.easy.common.TestA;
import com.easy.service.EasyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EasyController {
    //该类中需要EasyService类的对象
    //在这个类中只需要声明我们依赖EasyService这个类就可以,不需要代码主动获取EasyService类的对象
    //依赖注入(DI),通过识别依赖关系,注入对应的对象
    @Autowired
    EasyService easyS;
    @Autowired
    TestA testa;
    @RequestMapping("testb")
    public String testB(){
        testa.test();
        return "easy method";
    }
    @RequestMapping("easya")
    public String easya(){
        System.out.println(easyS);
        return "new Service";
    }

    @RequestMapping("hello")
    public String hello(){
        return "java so easy";
    }
}

注解

常用注解:

@Controller:

用于标识控制层组件,处理HTTP请求,返回响应结果。
@RestController:

结合了@Controller和@ResponseBody,用于RESTful风格的控制器,返回JSON数据。
@Service:

标识业务逻辑层组件,通常用于注解业务类。
@Repository:

标识数据访问层组件,通常用于注解DAO类。
@Component:

泛指Spring容器管理的组件,可以用于任何Spring管理的Bean。
@Bean:

用于定义Spring Bean,通常用于配置类中,将方法返回的对象注册为Spring容器的Bean。
@Configuration:

用于定义配置类,替代XML配置文件,其中包含@Bean注解的方法用于定义Bean。

SpringBean

SpringBean作用域:

Singleton:单例模式,一个Spring容器只存在一个实例。
Prototype:每次请求(或注入)时创建一个新实例。
Request:每个HTTP请求创建一个实例(仅在Web环境中有效)。
Session:每次会话都会创建一个新的对象。
GlobalSession:每个全局HTTP Session创建一个实例。

SpringBean的生命周期:

1)根据配置情况调用 Bean 构造方法或工厂方法实例化 Bean。

    public EasyBean(){
        System.out.println("1------构造方法");
    }

2)利用依赖注入完成 Bean 中所有属性值的配置注入。

    TestA testa;
    @Autowired
    public void setTesta(TestA testa){
        System.out.println("2------注入属性");
        this.testa=testa;
    }

3) 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。(叫什么名字)

    @Override
    public void setBeanName(String name) {
        System.out.println("3------BeanNameAware接口的setBeanName方法"+name);
    }

4)如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。(哪个工厂创建的)

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("4------BeanFactoryAware接口的setBeanFactory方法"+beanFactory);
    }

5) 当一个 Bean 实现了 ApplicationContextAware 接口并在 Spring 容器中被实例化时,Spring 容器会自动调用该 Bean 的 setApplicationContext 方法,并将应用程序上下文ApplicationContext作为参数传递进来。(创建的对象在哪个项目下)

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("5------ApplicationContext接口的setBeanFactory方法"+applicationContext);
    }

6)BeanPostProcessor 是 Spring 框架中的一个重要接口,它允许开发者在 Spring 容器创建和初始化 bean 的过程中,对 bean 进行自定义处理。这包括在 bean 实例化之后、属性设置之前(postProcessBeforeInitialization 方法),以及在 bean 初始化之后(postProcessAfterInitialization 方法)执行自定义逻辑。

Spring 容器在创建和初始化每一个 bean 时,都会调用 CustomBeanPostProcessor 中的这两个方法,允许你进行自定义处理。(初始化的处理器,before之前是实例化和after之前是初始化)

@Component
public class EasyBeanProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("easyBean")){
            System.out.println("6-----"+beanName+"  applicationContext的Before方法");
        }
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("easyBean")){
            System.out.println("9-----"+beanName+"  applicationContext的After方法");
        }
        return null;
    }
}

7)InitializingBean 是 Spring 框架中的一个接口,它定义了一个 afterPropertiesSet 方法。当 Spring 容器创建 bean 的所有属性都被设置完成后,会调用这个方法。(初始化Bean的接口)

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("7------InitializingBean接口的afterPropertiesSet方法");
    }

8)如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。(初始化方法)

    public void init(){
        System.out.println("8------initMethod");
    }

如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

    @Override
    public void destroy() throws Exception {
        System.out.println("easybean被回收了");
    }

运行结果:

了解springbean生命周期的必要性
pring Bean的生命周期定义了从bean的创建、初始化到销毁的一系列过程,以及在这些过程中Spring容器如何与bean进行交互
自定义初始化逻辑:
通过了解Spring Bean的生命周期,你可以知道何时是执行自定义初始化逻辑的最佳时机。例如,你可能需要在bean的依赖项注入之后立即进行某些设置或启动某些服务。通过使用@PostConstruct注解或者init-method属性,你可以确保这些初始化逻辑在bean的依赖项注入之后执行。
自定义销毁逻辑:
同样地,当bean不再需要时,你可能需要执行一些清理操作,如关闭资源连接、释放内存等。通过了解Spring Bean的生命周期,你可以知道何时是执行这些销毁逻辑的最佳时机。你可以通过实现DisposableBean接口或使用@PreDestroy注解来定义自定义的销毁方法。
集成第三方库:
当与第三方库集成时,这些库可能需要在特定的生命周期阶段执行特定的操作。了解Spring Bean的生命周期可以帮助你确定在何处集成这些库,以确保它们能够正常工作。
性能优化:
通过了解Spring Bean的生命周期,你可以更好地优化你的应用程序的性能。例如,如果你知道某个bean只在特定的请求期间需要,你可以考虑将其声明为作用域为request的bean,这样Spring就不会在整个应用程序的生命周期内都持有它的实例。
调试和排错:
当应用程序出现问题时,了解Spring Bean的生命周期可以帮助你更快地定位问题。例如,如果你知道某个bean的初始化方法总是被调用,但某些属性没有被正确设置,那么你可以检查这个初始化方法是否有问题,或者检查是否有其他bean在初始化方法之后修改了这些属性。
更好的设计决策:
了解Spring Bean的生命周期可以帮助你做出更好的设计决策。例如,你可能需要考虑是否将某个功能拆分为多个bean,以及这些bean应该如何相互协作。通过了解生命周期,你可以确定哪些bean应该在其他bean之前或之后创建和销毁。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 设计模式之原型模式

总目录 前言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中…

数据可视化工具,免费无限制制作报表

许多企业在报表制作上投入了大量资金,使用各种收费软件,往往只能满足基本需求,且操作复杂,让人感到无比头疼。不过最近我发现之前一直在做数据大屏的山海鲸可视化,现在新增了报表功能,不仅各种功能都可以免…

创新食堂管理:采购系统源码与供应链APP开发详解

今天,笔者将从食堂采购系统源码与供应链管理APP开发的角度,探讨如何利用技术创新提升食堂管理效率,并为企业带来更大的价值。 一、食堂采购系统的核心功能与优势 食堂采购系统是指用于管理食堂物资采购流程的软件系统,其核心功能…

《学会 SpringMVC 系列 · 剖析入参处理》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间 本章将分享缺省参数与函数重载相关知识,为了更加深入学习C打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项 🌈个人主页:是店小二呀 &#x1…

[CTFHub]ret2text-入土为安的第十二天

checksec pwn ida fn F5 main 点(_int64)v4 v大小为0x70栈基指针0x8返回地址 secure()

软件测试--python基础

一、python基础 (1)第一个python (2)python解释器 (3)基础语法 ①字面量 什么是字面量 常用的值类型 字符串 ②注释 ③变量 什么是变量 变量的特征 变量的目的是存储运行过程的数据 存储的目的是为了:重复使用 ④数据类型 type()语句 变量有类型吗?…

如何选择高品质SD存储卡—高耐用度、防水、防动、抗冲击

SD卡(Secure Digital Memory Card)是一种广泛使用的存储器件,因其快速的数据传输速度、可热插拔的特性以及较大的存储容量,广泛应用于各种场景,例如在便携式设备如智能手机、平板电脑、运动相机等,用于存储…

68.游戏分析工具设计以及更改辅助中存在的界面问题

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:67.利用FreeLibrary函数实现无痕注入的核心代码 分析工具主要做的是 游戏公共内容分析&…

【前端 · 面试 】TCP 总结(一)—— 概述

最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。 争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。 image 前言 我们常常会听到“ TCP 三次握手、…

注册中心--Eureka

🎥 个人主页:Dikz12🔥个人专栏:Spring Cloud实战📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.项目问题 2.解决URL问题 2.1解决思路 2.2注册中心 2.3 CAP理…

LeetCode3. 无重复字符的最长子串(java实现)

今天分享的题目是LeetCode3. 无重复字符的最长子串,来看题目描述: 无重复的最长子串,题目有可能有些小伙伴没读太懂,其实就是找到不重复的最长子串,比如eg3,pwwk,那么w出现了两次就不符合要求。…

SpringBoot中的server.context-path

一、问题引入 书接上回,SpringBoot 在 idea中的 .idea和 .iml文件-CSDN博客,我在boot-test的测试项目中使用的 SpringBoot版本为 1.3.5.RELEASE,新项目 cps-task中使用的版本为 2.4.8,造成了连接异常,问题很好解决&…

一文看懂Java反射、注解、UML图和Lambda表达式

反射 定义: 反射是 java 开发语言的特征之一,它允许 java 程序对自身进行检查(自审),并能直接操作程序内部属性,即就是将类中的各种成分映射成一个 java 对象,利用反射技术可以对一个类进行解剖,将各个组成部分映射成…

c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

目录 前言: 1.vector的介绍及使用 1.2 vector的使用 1.2 1 vector的定义 1.2 2 vector iterator(迭代器)的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5vector 迭代器失效问题。 2.vector模拟实现 2.1 std::vect…

RAG 革命:NVIDIA 工作站如何成为企业 AI 的秘密武器

在深圳的一家科技初创公司,首席技术官李梅正在向她的团队展示一个令人兴奋的新项目。“看这个,” 她指着屏幕上的实时演示说,“我们刚刚用公司的技术文档训练了一个 AI 助手,它现在可以回答任何关于我们产品的问题,而且…

鸿蒙系统开发【网络管理】

网络管理 介绍 此Demo展示如何查询网络详情、域名解析、网络状态监听等功能。 效果预览: 使用说明: 1.启动应用,在点击检查网络、网络详情、网络连接信息后,展示对应的信息; 2.在域名解析的模块下,输入…

一款功能强大的免费开源卸载工具

BCUninstaller,也称为Bulk Crap Uninstaller(简称BCU),是一款免费且开源的Windows平台专用程序卸载工具。它的主要功能是帮助用户高效地批量卸载不需要的应用程序和组件,从而优化系统性能。 BCUninstaller功能特点 批…

8.1 tomcat+jdk

接着昨天的 npm run serve 构建项目 npm run build ls ls dist/ vim dist/index.html [rootweb eleme_web]# cd /usr/local/nginx/conf/ [rootweb conf]# ls 将静态的项目移动到nginx中 [rootweb nginx]# cd conf.d/ [rootweb conf.d]# ls qd.conf [rootweb conf.…

有关 AI 与产品经理的三个暴论

最近跟朋友聊 AI 聊得挺多。往往是不管做什么的,凡是跟互联网有联系的,都挺兴奋,都在讨论 AI。 聊着聊着,有三个暴论浮出水面,跟各位分享。暴论归暴论,道理还是在的。 1. AI 带来的新技术,会带…