Spring框架

1. Spring框架的作用

Spring是一个开源框架,为简化企业级应用开发而生。Spring可以是使简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。
​
主要解决了创建对象和管理对象的问题。
在使用Spring框架后,当需要某个对象时,直接通过Spring获取此对象即可。
​
Spring可以保证类的对象的唯一性,使得各组件出现依赖关系时,不会创建多个相同的对象。
由于Spring会创建很多个对象并管理起来,开发者需要时直接获取即可,所以,Spring也通常被称之为“Spring容器”。

2. Spring框架的常用注解

使得自定义的类被Spring管理对象,确保类在组件扫描的包下,且在类上添加组件注解
(认识4个基础的组件注解
    @Component , @Controller , @Service , @Repository)
​
(Spring的自动装配注解
    @Autowired)
    
(Spring配置类注解
    @Configuration)
​
(关于mapper包组件扫描
    @Mapper , @MapperScan , @ComponentScan)
    
(启动类注解
    @SpringBootApplication)
    
(特别理解
- 在属性上添加`@Autowired`,则Spring会自动尝试为此属性赋值,是否成  功,取决于Spring容器中是否存在合适的对象
- 理解组件之间的调用关系
  Controller >>> Service >>> Repository
- 理解基于接口的编程的思想
​
- 在@SpringBootApplication的声明上有@ComponentScan,则          @SpringBootApplication具有@ComponentScan的效果。
- 在@SpringBootApplication的声明上有@ComponentScan,则          @ComponentScan可称之为@SpringBootApplication的元注解。
​
​
)

3. 通过Spring创建并管理对象--组件扫描(Spring注解)

Spring提供了组件扫描的机制,它可以扫描指定的包,并查找此包及其子孙包下是否存在组件类,判定组件类的标准是类上是否存在组件注解,基础的组件注解有:(四种基础注释)
- `@Component`
- `@Controller`
- `@Service`
- `@Repository`
​
在Spring框架的解释中,以上4个注解是完全等效的,只是语义不同。
所以,当某个类需要被Spring框架创建对象时,需要:
1. 确保这个类在组件扫描的范围之内
2. 确保这个类添加了组件注解
提示:在Spring Boot项目中,默认就已经配置好了组件扫描,扫描的根包就是创建项目时已存在的包。

4. 通过Spring创建并管理对象--@Bean方法

在Spring框架的使用中,如果某个类添加了`@Configuration`注解,则此类将是“配置类”。
注意:配置类也必须在组件扫描的范围内。
​
在配置类中,可以自行添加一些方法,在方法上添加`@Bean`注解,则此方法会被Spring自动调用,且方法返回的对象也会被Spring管理。
​
在同一个配置类中,允许存在多个`@Bean`方法。
关于方法的声明:
- 访问权限:应该是`public`
- 返回值类型:你希望Spring管理的对象的类型
- 方法体:应该正确的返回与声明匹配的对象
- 方法名称:自定义
​
所以,当某个类需要被Spring框架管理对象时,需要:
- 在配置类中添加`@Bean`方法,使用此方法返回需要被管理的对象

5. 如何选择创建并管理对象的方式(两种方法 , 添加组件扫描与加@Bean注解)

仅自定义的类型可以使用组件扫描的方式,当然,自定义的类型也可以使用`@Bean`方法的做法,但是不推荐。
​
非自定义的类型不可以使用组件扫描的方式(因为你没有办法在这些类型上添加组件注解),只能使用`@Bean`方法的做法。

6. 自动装配

1. 当某个属性需要值时,或被Spring调用的方法需要参数值时,Spring框架会自动从容器中查找符合的对象,自动为属性或方法的参数赋值。
​
2. 在属性上,添加`@Autowired`注解,即可使得Spring尝试自动装配。
​
3. 当Spring尝试实现自动装配时,会从Spring容器中查找合适的对象,关于“合适”的判定标准,首先,类型必须匹配,如果匹配类别的Bean有多个,    必须保证名称匹配才可以正确装配。
​
4. 关于名称匹配:被自动装配的属性名称,与Bean的名称相同。
​
5. 关于Bean的名称:如果类名的第1个字母是大写的,且第2个字母是小写的,则Bean的名称是将类名首字母改为小写,例如BrandRepositoryImpl的Bean名称就是brandRepositoryImpl,否则,Bean名称就是类名。
​
6. 关于名称,还可以使用注解来指定名称,例如:
通过以下@Resource注解的name指定名称后,将会通过Spring容器中名为categoryServiceImpl的Bean来装配
@Resource(name = "categoryServiceImpl")
private ICategoryService categoryService;
​

7. Spring Bean的作用域+Spring<单例,预加载,懒加载,Bean周期,Spring IoC与DI与AOP>

1). Spring Bean的作用域

1.0  Spring管理的对象默认都是单例的,可以使用        @Scope("prototype")使之“非单例”。
​
1.1  单例:单一实例,具体表现为:在某一时间点,此类的对象最多只有     1个。
​
1.2  
需要注意:Spring Bean的特性与通过设计模式中的单例模式创建的对象相同,但是,Spring框架并没有使用单例模式,所以,在描述时,把Spring Bean描述为单例模式是不对的。
​
1.3
当Spring管理的对象是单例状态时,默认是预加载的(加载Spring环境时就会创建此类的对象,类似于设计模式中的单例模式的饿汉式),也可以使用@Lazy注解将其配置为懒加载的(加载Spring环境时并不会直接创建此类的对象,当第1次尝试获取此对象时,才会创建对象,类似于设计模式中的单例模式的懒汉式)

2). Spring Bean的生命周期

1.Bean的声明周期

  • 实例化 Instantiation

  • 属性赋值 Populate

  • 初始化 Initialization

  • 销毁 Destruction

在自定义的、被Spring管理的类中,可以自定义方法,在方法上添加`@PostConstruct`注解后,此方法将变为Spring Bean生命周期中的**初始化方法**,则会在创建此类的对象之后,被Spring自动调用,还可以自定义方法,在方法上添加`@PreDestroy`注解后,此方法将变为Spring Bean生命周期中的**销毁方法**,则会在销毁对象的前一刻,被Spring自动调用。

3). Spring IoC与DI

IoC:Inversion of Control,即:控制反转,表现为:交对象的控制权(创建权力、管理权力)交给框架。
​
DI:Dependency Injection,即:依赖注入,当前类中的代码需要通过另一个类的执行来实现,则当前类依赖于另一个类,例如Controller依赖Service,Service依赖Mapper,Spring可以通过自动装配等机制为依赖项赋值,由于在编写的源代码中并没有使用到赋值符号(`=`),所以,这个行为叫作“注入”。
​
(IOC控制反转:SpringIOC负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。)
​
Spring框架通过DI完善的实现了IoC,所以,DI是一种实现手段,IoC是需要实现的目标。

4).Spring AOP

AOP:面向切面的编程
注意:AOP并不是Spring特有的技术,只是Spring对AOP提供了很好的支持
在项目中,处理的处理流程大致是:
​
注册 --(请求)--> Controller --> Service.reg() --> Mapper
​
登录 --(请求)--> Controller --> Service.login() --> Mapper
​
改密 --(请求)-> Controller -> Service.changePassword() -> Mapper
​
假设存在某个需求:需要统计每个业务方法的执行耗时。
要想实现此目标,可以自定义一个切面类:
​
​
AOP主要解决的问题:性能监测、日志跟踪、事务管理等等。
事实上,在Java开发领域中,有许多主流的框架都使用到了AOP,所以,一般不需要手动编写AOP。

8. 关于Spring框架的异常

8.1 ## NoSuchBeanDefinitionException
​
**无此Bean的异常**
​
在异常信息中会提示到底是缺少哪个Bean,例如以下提示的`cn.tedu.csmall.server.controller.CategoryController`,然后,再结合你的配置来检查!
​
创建对象的方式只有2种,要么是组件扫描,要么是`@Bean`方法,检查对应的代码即可。
​
如果提示的类型并不是自已配置的,且应该是正常的可用的,可考虑为依赖项错误的问题,则参考《前置技术清单中第3条来解决》。
8.2 ## NoUniqueBeanDefinitionException
​
**不唯一的Bean的异常**
​
当尝试自动装配时,匹配类型的Bean超过1个

版权声明:本文为m0_71202849原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。