Spring (Day 16)

一、 Maven

maven作用:用于统一管理第三方制作好的Jar。

 1.配置: 设置setting文件

(1)阿里镜像


  - ~~~xml
    <mirror> 
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    ~~~


(2)存储目录

  - ~~~xml
    <localRepository>D:\WPS Office\Jweb\apache-maven-3.6.1\mvn_resp</localRepository>
    ~~~

2. 创建Maven项目


~~~xml
<!--   引入依赖项    -->
<dependencies>
    <!--        依赖唯一标识-->
    <dependency>
        <!--            组名、公司名-->
        <groupId>org.springframework.boot</groupId>
        <!--            项目名-->
        <artifactId>spring-boot-starter-web</artifactId>
        <!--            项目版本号-->
        <version>2.6.6</version>
    </dependency>
</dependencies>
~~~

3.启动SpringBoot步骤

(1) 创建一个主类,并使用@SpringBootApplication注解
(2) SpringApplication.run(类对象,args)

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

    }

}

配置maven环境,搭建springboot依赖 ----> springboot项目 (思想:约定大于配置)

二、Spring 常用注解 

  @Controller @RestController(访问层) @Service(业务类)  @Repository(Dao数据访问)
    @Component(其他功能类)  @Bean  @Configuration

1. 组件扫描注解

  • @Controller:用于Web层,标识一个类为控制器组件,处理HTTP请求。
  • @RestController:组合了@Controller@ResponseBody,用于RESTful Web服务,方法返回值直接作为响应体。
  • @Service用于业务逻辑层,标识一个类为服务层组件,处理业务逻辑。
  • @Repository:用于数据访问层(DAO),标识一个类为持久层组件,处理数据访问。
  • @Component通用组件注解,标识一个类为Spring组件,适用于其他功能类。

2. 配置注解

  • @Bean在配置类中使用,定义一个Spring Bean。
  • @Configuration:标识一个类为配置类,包含Spring Bean的定义。

3. 其他常用注解

  • @Autowired:自动装配Bean,按类型注入。
  • @Qualifier:与@Autowired一起使用,按名称注入。
  • @Value:注入配置文件中的属性值。
  • @Scope定义Bean的作用域,如单例(singleton)或原型(prototype)。
  • @PostConstruct:在Bean初始化后执行的方法。
  • @PreDestroy:在Bean销毁前执行的方法。
  • @RequestMapping(("/访问路径") 映射HTTP请求到控制器方法。
  • @GetMapping@PostMapping@PutMapping@DeleteMapping:分别映射GET、POST、PUT、DELETE请求。
  • @RequestParam:绑定请求参数到方法参数。
  • @PathVariable:绑定URL路径变量到方法参数。
  • @RequestBody:绑定请求体到方法参数。
  • @ResponseBody:将方法返回值作为响应体。
  • @Transactional:声明式事务管理,标识一个方法或类需要事务支持。

三、@Service为什么不能替代@Controller?

  1. 职责不同

    • @Service主要负责业务逻辑处理,不直接处理HTTP请求和响应。
    • @Controller@RestController负责处理HTTP请求,调用服务层组件,返回响应结果。
  2. 注解功能不同

    • @Controller@RestController提供了处理HTTP请求的注解,如@RequestMapping@GetMapping@PostMapping等。
    • @Service没有这些功能,无法处理HTTP请求。
  3. 架构分层

    • 分层架构有助于代码的组织和维护,明确各层的职责。
    • 使用@Service@Controller(或@RestController)可以清晰地划分业务逻辑层和Web层,便于团队协作和代码管理。

四、bean 注入

1.依赖注入(字段/属性):通过直接在字段上使用@Autowired注解来注入依赖

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

   }

2. 构造函数注入(Constructor Injection):通过构造函数参数来注入依赖。这种方式适用于必须的依赖,且在Bean创建时一次性注入所有依赖。

3. Setter方法注入(Setter Injection):通过Setter方法来注入依赖。这种方式适用于可选的依赖,可以在Bean创建后动态注入依赖。

4. 使用@Qualifier注解:当有多个相同类型的Bean时,可以使用@Qualifier注解来指定具体的Bean。

5. 使用@Value注解注入属性值:可以使用@Value注解从配置文件中注入属性值。

五、IOC 与 DI

  • IoCInverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
  • IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Mapkeyvalue,Map 中存放的是各种对象。
  • 将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
  • IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件xml/注解即可,完全不用考虑对象是如何被创建出来的。
  • IoC 是一个概念,是一种思想,其实现方式多种多样。Spring 框架使用依赖注入(DI)实现 IoC

DI DI—Dependency Injection ,即 依赖注入
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
通常,依赖注入可以通过三种方式完成,即:
  • 构造函数注入
  • setter 注入
  • 接口注入
Spring Framework 中,仅使用构造函数和 setter 注入。

Spring IOC 作用:管理项目中的Java bean的生命周期

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

Spring提供了IOC的方式,方便获取该对象(IOC:控制反转)

容器和代码之间的代码控制权反转,代码中不需要明文调用来方法得到对象, 只需要声明该类需要什么类型的对象即可

六、springbean的作用域  

Spring Bean的作用域:
* singleton  单例模式 (一个对象)---默认作用域
* prototype  原型模式 (每次需要都来一个新的对象)
* request    web项目中请求作用域,每次请求都会创建一个新的对象
* session    每次会话都会创建一个新的对象,
* (第一次访问服务器开始,默认30分钟超时断掉session,安全退出断掉session)
* GlobalSession  (分布式集群) 全局的


七、springbean的生命周期

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

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

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

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

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

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

    • 在这一步执行的是postProcessBeforeInitialization方法

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

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

    • initMethod指定的方法必须是void类型,并且不接受任何参数

  • 9)如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。

  • 10)如果在 <bean> 中指定了该 Bean 的作用范围为 scope="singleton",则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 <bean> 中指定了该 Bean 的作用范围为 scope="prototype",则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。

    • @Scope(scopeName =ConfigurableBeanFactory.SCOPE_PROTOTYPE )

    • @Scope(scopeName =ConfigurableBeanFactory.SCOPE_SINGLETON)

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

八、了解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之前或之后创建和销毁。

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值