一、 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?
-
职责不同:
@Service
主要负责业务逻辑处理,不直接处理HTTP请求和响应。@Controller
和@RestController
负责处理HTTP请求,调用服务层组件,返回响应结果。
-
注解功能不同:
@Controller
和@RestController
提供了处理HTTP请求的注解,如@RequestMapping
、@GetMapping
、@PostMapping
等。@Service
没有这些功能,无法处理HTTP请求。
-
架构分层:
- 分层架构有助于代码的组织和维护,明确各层的职责。
- 使用
@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
- IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
- IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。
- 将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
- IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件xml/注解即可,完全不用考虑对象是如何被创建出来的。
- IoC 是一个概念,是一种思想,其实现方式多种多样。Spring 框架使用依赖注入(DI)实现 IoC
- 构造函数注入
- 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之前或之后创建和销毁。
-
-