Spring 笔记
@Service 修饰 class,不修饰 service
在 Spring Framework 中,@Service
注解通常用于标识一个类作为服务层的组件,用来处理业务逻辑。
当 @Service
注解用于修饰一个类时,Spring 会将这个类识别为一个服务组件(Service),并将其纳入到 Spring IoC 容器管理中。这意味着你可以通过依赖注入(Dependency Injection)或者其他 Spring 功能来管理和使用这个类的实例。
通常情况下,@Service
注解用于标识业务逻辑类,比如处理数据操作、调用 DAO 层、处理事务等。
在 Spring 中,@Service
注解通常不直接用于接口。接口本身不会被 Spring IoC 容器实例化和管理。Spring 更倾向于使用接口作为服务组件的定义或者约定,而具体的实现类则会被 @Service
或其他适当的注解标注,然后由 Spring 自动扫描并注册到容器中。
四种常见的 Spring Bean 的作用域 @Scope(”xxx“)
singleton prototype request session
@Configuration
可以被@Component 替代?
@Configuration
是否需要显示调用?
@SpringBootApplication
包含什么注解?
Configuration 一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。
在 Spring Framework 中,@Configuration
注解用于标识一个配置类,该类包含一个或多个用 @Bean
注解的方法,这些方法会生成 Spring 容器管理的 bean。
MyConfiguration
类不需要被显式调用,因为 Spring 容器会自动扫描并实例化该类。具体过程如下:
- 自动扫描:当 Spring 应用启动时,Spring 容器会自动扫描带有
@Configuration
注解的类。如果你使用的是 Spring Boot,通常会在启动类上使用@SpringBootApplication
注解,这个注解包含了@ComponentScan
,会自动扫描同一包及其子包中的所有@Configuration
类。 - 自动注册 bean:在
@Configuration
类中,所有带有@Bean
注解的方法都会被调用,返回的对象会被注册到 Spring 容器中。Spring 容器会管理这些 bean 的生命周期。
可以把 @SpringBootApplication
看作是 @Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。
@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制@ComponentScan
: 扫描被@Component
(@Service
,@Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration
:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
读取配置信息的注解有哪些?
wuhan2020: 2020年初武汉爆发了新型冠状病毒,疫情严重,但是,我相信一切都会过去!武汉加油!中国加油!
my-profile:
name: Guide哥
email: koushuangbwcx@163.com
library:
location: 湖北武汉加油中国加油
books:
- name: 天才基本法
description: 二十二岁的林朝夕在父亲确诊阿尔茨海默病这天,得知自己暗恋多年的校园男神裴之即将出国深造的消息——对方考取的学校,恰是父亲当年为她放弃的那所。
- name: 时间的秩序
description: 为什么我们记得过去,而非未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利用诗意的文字,邀请我们思考这一亘古难题——时间的本质。
1. @value
(常用)
使用 @Value("${property}")
读取比较简单的配置信息:
@Value("${wuhan2020}")
String wuhan2020;
2. @ConfigurationProperties
(常用)
通过@ConfigurationProperties
读取配置信息并与 bean 绑定。
@Component
@ConfigurationProperties(prefix = "library")
class LibraryProperties {
@NotEmpty
private String location;
private List<Book> books;
@Setter
@Getter
@ToString
static class Book {
String name;
String description;
}
省略getter/setter
......
}
进到 IoC 的对象们,如何拿到它?
要调用 SmartEngine
对象,可以通过 Spring 的依赖注入来获取它。在你的应用程序的任何地方,可以注入 SmartEngine
类型的 bean,并使用它执行相应的操作。
1、在 Spring 管理的类中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private final SmartEngine smartEngine;
@Autowired
public MyService(SmartEngine smartEngine) {
this.smartEngine = smartEngine;
}
// 现在你可以在这个类的任何方法中使用 smartEngine 对象了
}
2、不是在 Spring 管理的类中
可以通过 ApplicationContext
手动获取 SmartEngine
bean:
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyOtherClass {
public void someMethod() {
ApplicationContext context = new AnnotationConfigApplicationContext(SmartEngineAutoConfiguration.class);
SmartEngine smartEngine = context.getBean(SmartEngine.class);
// 现在你可以使用 smartEngine 对象了
}
}
@ConditionalOnClass
有什么用?
在Spring框架中,@ConditionalOnClass
注解用于指定当类路径中存在指定的类时,才会创建被注解的配置类实例或Bean。具体来说:
- 当使用
@ConditionalOnClass(SmartEngine.class)
注解一个配置类或者一个@Bean
方法时,它的含义是:只有当当前应用的类路径(即编译后的类路径)中包含了SmartEngine
这个类时,Spring 容器才会考虑创建这个配置类实例或者这个@Bean
方法返回的Bean。
这种机制在Spring Boot应用中特别有用,因为它允许你根据类的可用性来动态决定是否配置某些功能或加载某些Bean。在上面提到的代码中,使用了 @ConditionalOnClass(SmartEngine.class)
来确保只有在引入了相关依赖并且能够访问 SmartEngine
类时,才会执行自动配置类中的逻辑,避免了在不需要 SmartEngine
的环境下产生不必要的配置和Bean加载。
关键的是,在编译后的 target
目录(通常是 target/classes
或者 target/your-project-name.jar
)中,需要确保存在编译后的 SmartEngine
类的字节码文件或者它的依赖库(比如 JAR 包)。
@ConditionalOnMissingBean 有什么用?
它的作用是在容器中不存在某个特定类型的Bean时,才会创建被注解的Bean。这样可以避免因重复定义或者不必要的覆盖而引发的问题,保证了Bean的唯一性和合理性。
具体来说,假设有一个类 SmartEngineAutoConfiguration
,它包含一个 @Bean
方法用来创建 SmartEngine
实例。使用 @ConditionalOnMissingBean
注解这个 @Bean
方法,可以确保:
- 如果在Spring容器中已经存在了
SmartEngine
类型的Bean(可能是由其他配置类定义的),那么Spring不会再创建这个@Bean
方法所定义的SmartEngine
实例。 - 只有当容器中确实没有
SmartEngine
类型的Bean时,Spring才会调用这个@Bean
方法,创建并注册一个新的SmartEngine
实例。
这种机制非常有用,特别是在多个配置类可能都尝试定义同一类型的Bean时,可以避免因重复定义而导致的冲突和覆盖问题,确保应用程序的配置是有效和一致的。
@Order
@Order(LOWEST_PRECEDENCE)
是一个Spring框架中的注解,用于指定Bean的加载顺序或执行顺序。具体来说:
@Order
注解用于定义Bean的顺序,可以用在类上或者方法上。LOWEST_PRECEDENCE
是一个常量,表示最低优先级。在Spring中,优先级常量的数值越低,优先级越高,即越先被加载或执行。
所以,@Order(LOWEST_PRECEDENCE)
的意思是告诉Spring容器,该Bean或者配置类应该以最低的优先级被加载或执行。在处理多个Bean时,低优先级的Bean会在高优先级的Bean之后被处理。
这对于确保某些配置在其他配置之后生效或者确保某些逻辑在其他逻辑之后执行是很有用的。在您提到的代码中,这个注解被用来确保 SmartEngineAutoConfiguration
类的初始化顺序。
它只规定 Bean 之间的顺序,和 setApplicationContext
之类的先后顺序没关系。