当前位置: 首页 > news >正文

JAVA Spring学习Day1

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),通过识别依赖关系,注入对应的对象@AutowiredEasyService easyS;@AutowiredTestA 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;@Autowiredpublic void setTesta(TestA testa){System.out.println("2------注入属性");this.testa=testa;}

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

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

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

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

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

    @Overridepublic 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 {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if(beanName.equals("easyBean")){System.out.println("6-----"+beanName+"  applicationContext的Before方法");}return null;}@Overridepublic 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的接口)

    @Overridepublic 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 进行销毁。

    @Overridepublic 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.lryc.cn/news/411975.html

相关文章:

  • linux常见面试题(三)
  • 【JS】ES6新类型Map与Set
  • FETCH FIRST ROW ONLY和 DISTINCT ON和 LIMIT 1的用法
  • 前端小白安装node、vue、Express、Electron及(Electron桌面端exe应用开发)
  • solidity多态【很重要】
  • Jangow-1.0.1靶机漏洞复现(未完成)
  • 软件测试--python基础
  • GPIO子系统
  • 学会这个Python库,接口测试so easy
  • Stable Diffusion4.8.7(Ai绘画)软件安装教程
  • 操作系统错误处理
  • 【靶场实操】sql-labs通关详解----第一节:基础注入方式(Less-1~Less-10)
  • 力扣676.实现一个魔法字典
  • ctfshow-web入门-sql注入(web171-web175)
  • 视频怎么添加音乐?分享5种视频添加音乐方法
  • 黑马JavaWeb后端案例开发(包含所有知识点!!!)
  • FPGA开发——蜂鸣器实现音乐播放器的设计
  • InnoDB存储引擎(1)
  • VMWare虚拟机共享主机的网络访问外网
  • LeetCode Easy|【415. 字符串相加】
  • RAG 革命:NVIDIA 工作站如何成为企业 AI 的秘密武器
  • 九大原则,轻松构建个人高效SOP
  • Airtest的demo实现多设备并行
  • 社区养老服务小程序的设计
  • Interceptor拦截器开发
  • 美团 AIGC产品经理面经(已拿 offer)
  • @RequestBody与@RequestParam
  • vmware上,虚机经常丢失网卡。导致无法上网。
  • git 鉴权失败
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理