spring注解整理

spring注解整理

@Configuration

使用@Configuration注解来标注的类为配置类,配置类就相当于applicationContext.xml配置文件,可以在配置类中来配置bean

@Configuration
public class MainConfig {

    /**
     * bean的类型是返回类型,bean的id默认是方法名称
     * @return
     */

    @Bean
    public Person person(){
        return new Person("张三",18);
    }
}
@Bean

使用@Bean来标注方法以此来进行bean的实例化,bean的类型是返回类型,bean的id默认是方法名称,可以使用@Bean注解来自定义bean的id以及初始化方法、销毁方法

@Bean就是使用注解的方式来替换xml配置bean的方式

public @interface Bean {
    @AliasFor("name")
    String[] value() default {};

    @AliasFor("value")
    String[] name() default {};

    Autowire autowire() default Autowire.NO;

    String initMethod() default "";

    String destroyMethod() default "(inferred)";
}
bean的作用域@Scope

可以在生成bean的方法上使用@Scope来指定bean的作用域

  • ConfigurableBeanFactory#SCOPE_PROTOTYPE
  • ConfigurableBeanFactory#SCOPE_SINGLETON
  • org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
  • org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
懒加载@Lazy

对于单例bean默认是在容器启动的时候加载,可以使用懒加载来使其第一次调用时再进行加载,防止其进行预初始化

在生成bean的方法上使用@Lazy来使用来加载

bean的条件注册@Conditional

spring4才有的条件注册

@Conditional可以标注在类上,也可以标注在方法上,满足某一个特定的条件创建一个特定的Bean

public @interface Conditional {

   //Condition类数组
   Class<? extends Condition>[] value();

}

可以自定义Condition,需要实现Condition接口

@Primary

如果存在多个相同类型的bean,可以使用@Primary注解来标注bean,使得该bean为默认获取到的bean

工厂bean

可以使用FactoryBean来使用工厂bean来实例化bean,此时使用personFactoryBean来获取到的是Person的实例

@Bean
public PersonFactoryBean personFactoryBean(){
    return new PersonFactoryBean();
}

public class PersonFactoryBean implements FactoryBean<Person{
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

如果想要获取到FactoryBean本身的实例,可以使用&personFactoryBean来获取

@DependsOn

@DependsOn 注解可以强制的加载Spring IoC容器中的bean,用来保证bean之间的依赖关系

@ComponentScan

在配置类上标注组件扫描,相当于<context:component-scan>可以配置扫描的规则,使用basePackages来指定扫描的包,includeFilters和excludeFilters来配置包含或者排除的规则,与配置文件相似

两个示例

//排除Controller注解标识的bean
@ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})

// 只包含Controller注解标识的bean,不要忘记useDefaultFilters 
false,与使用配置文件相似
@ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},
        useDefaultFilters = false,
        includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})

})

过滤的类型有以下几种

  • ANNOTATION 按照注解,最常用
  • ASSIGNABLE_TYPE 按照类型
  • ASPECTJ 使用ASPECTJ表达式
  • REGEX 使用正则表达式
  • CUSTOM 使用自定义规则,实现TypeFilter接口

@Import

相当于<import resource="xxx.xml">

使用Import可以进行组件导入,对于第三包中的所需要用到的bean,没有必要每一个都使用@Bean来进行一个个的实例化,可以使用@Import来直接导入bean组件

  • @Import(要导入的组件名) bean的id默认为全类名

  • @Import(importSelector类) 实现importSelector接口,重写selectImports方法,返回值就是组件全类名的数组

    String[] selectImports(AnnotationMetadata importingClassMetadata);
  • @Import(ImportBeanDefinitionRegistrar类) 实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法,自己使用registry进行注册某些bean

    void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

spring中所提供的@EnableXXX就是对于@Import进行的封装,如EnableAspectJAutoProxy

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy 
{

   boolean proxyTargetClass() default false;

   boolean exposeProxy() default false;

}

@ImportResource

相当于<import resource="xxx.xml">

与@Import不同的是,@ImportResource是来引入xml配置文件的,用于将 applicationContext.xml文件中的bean加载到ApplicationContext中

@Value

使用@Value可以为属性进行赋值

基本数值
@Value("张三")
String name;
Spel表达式

#{}

环境变量中的值(配置文件中的值)

${}

@PropertySource

需要引入配置文件,使用@PropertySource,可以加载引入的*.properties文件内容,并加载到IOC容器中(PropertySourcePlaceholderConfigurer来进行占位符的填充),与@Configuration类一起使用

相当于 <context:property-placeholder>

也可以使用@PropertySources注解来组合多个@PropertySource

@PropertySources(
        {
                @PropertySource(value = "classpath:test.properties")
        }
)
@PropertySource(value = "classpath:test.properties")
@Configuration
public class MainConfig4 {

    @Bean
    public TestValue testValue(){
        return new TestValue();
    }
}

public class TestValue {
  // 取出配置文件中的值
    @Value("${test.value}")
    private int value;
}

@PostConstruct和@PreDestroy

@PostConstruct用来标记是在项目启动的时候执行这个方法,用来修饰一个非静态的void()方法,spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行,@PreDestroy方法在destroy()方法执行执行之后执

@Profile

可以使用@Profile注解来标识某些bean是在特定环境下进行加载的

@Autowired

用来装配bean,可以写在字段上,或者方法上。 默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)

@Autowired注解是依靠的AutowiredAnnotationBeanPostProcessor后置处理器来实现的

@Resource

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入。

@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型,如果使用name属性,则使用byName的自动注入策略;使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略

@Resource注解是依赖于CommonAnnotationBeanPostProcessor后置处理器来实现的

@Required

适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常

@Qualifier

当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱

功能开启相关@Enable

@Enable*注解是引入@Import注解来进行操作的

@EnableAspectJAutoProxy

开启对AspectJ自动代理的支持

在之前为了使@Aspect注解生效需要在配置文件中配置

<aop:aspectj-autoproxy/>

而该注解的作用就是使得@Aspect注解生效,开启基于注解的AOP模式,与上述配置功能相同

@EnableTransactionManagement

开启注解式事务的支持

在之前为了使@Transaction注解生效,需要在配置文件中配置

<tx:annotation-driven transaction-manager="transactionManager"/>

而是用该注解的作用就是使得@Transaction注解生效,与上述配置功能相同

@EnableAsync

开启异步方法的支持

@EnableScheduling

开启计划任务的支持

@EnableWebMvc

开启Web MVC的配置支持

@EnableConfigurationProperties

开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories

开启对SpringData JPA Repository的支持

@EnableCaching

开启注解式的缓存支持

单元测试相关

@RunWith 运行器,Spring中通常用于对JUnit的支持

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration 用来加载配置ApplicationContext,其中classes属性用来加载配置类

@ContextConfiguration(classes={MyConfig.class})

https://zhhll.icu/2021/框架/spring/基础/11.spring注解整理/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-2024年人形机器人行业报告合集(精选397份)

人形机器人行业报告&#xff08;精选397份&#xff09; 2023-2024年 【以下是资料目录】 报告来源&#xff1a;下载教程&#xff08;海选智库&行业资源智库&#xff09; 2024流程工业智能制造机器人业务开启新增长曲线 2024电子皮肤行业深度研究报告&#xff1a;赋予机…

vue用法示例(一)

1、v-html html 插入&#xff0c;可以插入文本&#xff0c;也可以插入元素&#xff0c;如 message:"<h1>xxx</h1>" <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Vue 测试实例 - 菜鸟教程(runo…

mysql基础18——权限管理

权限管理 根据不同的用户进行横向和纵向的分组 横向的分组 用户可以接触到的数据的范围 纵向的分组 用户对接触到的数据能访问到什么程度 把具有相同数据访问范围和程度的用户分为不同的类别 这种类别叫做角色 通过角色对相同权限的用户进行分组管理 可以使权限管理更加简单…

ROS2 仿真学习02 Gazebo导入官方示例模型

1.下载模型 git clone https://gitee.com/bingda-robot/gazebo_models.git将gazebo_models拖到到.gazebo当中&#xff08;如果没看到.gazebo文件请按住CTRLh&#xff09; 2.添加模型到gazebo的Insert 这就将官方示例的模型都导入到Gazebo 了 随便试试一个模型

SLS 查询新范式:使用 SPL 对日志进行交互式探索

作者&#xff1a;无哲 引言 在构建现代数据和业务系统的过程中&#xff0c;可观测性已经变得至关重要&#xff0c;日志服务&#xff08;SLS&#xff09;为 Log/Trace/Metric 数据提供了大规模、低成本、高性能的一站式平台服务&#xff0c;并提供数据采集、加工、投递、分析、…

海外平台运营为什么需要静态住宅IP?

在世界经济高度全球化的今天&#xff0c;许多企业家和电子商务卖家纷纷转向海外平台进行业务扩展。像亚马逊、eBay这样的跨国电商平台为卖家提供了巨大的机会&#xff0c;来接触到世界各地的顾客。然而&#xff0c;在这些平台上成功运营&#xff0c;尤其是维持账号的健康和安全…

算法刷题记录 Day51

算法刷题记录 Day51 Date: 2024.04.19 lc 42. 接雨水 // 单调栈 class Solution { public:int trap(vector<int>& height) {// 思路2&#xff1a;单调栈。当有个元素要入栈时。若该元素小于等于栈顶&#xff0c;则直接入栈&#xff1b;// 若该元素大于栈顶&#x…

脚本开发与自动化运维

shell脚本开发 grep搜索工具 参数&#xff1a; -A<显示行数>&#xff1a;-A NUM, --after-context NUM&#xff0c;除了显示符合范本样式的那一行之 外&#xff0c;并显示该行之后的内容。 -B<显示行数>&#xff1a;--before-context NUM&#xff0c;除了显示…

使用51单片机控制T0和T1分别间隔1秒2秒亮灭逻辑

#include <reg51.h>sbit LED1 P1^0; // 设置LED1灯的接口 sbit LED2 P1^1; // 设置LED2灯的接口unsigned int cnt1 0; // 设置LED1灯的定时器溢出次数 unsigned int cnt2 0; // 设置LED2灯的定时器溢出次数// 定时器T0 void Init_Timer0() {TMOD | 0x01;; // 定时器…

Leetcode 1047:删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 import java.util.Stack;public…

数据分析师平均薪资18322,这11个行业需求量最大!

2024年&#xff0c;是一个被数据深刻影响的时代。数据&#xff0c;如同无形的燃料&#xff0c;驱动着现代社会的运转。从全球互联网用户每天产生的2.5亿TB数据&#xff0c;到制造业的传感器、金融交易、医疗病历等各个领域的海量信息&#xff0c;数据的量级每年都在呈指数级增长…

Linux 内核设备树 ranges属性

今天有人问了我一下ranges属性&#xff0c;找了相关资料确认后&#xff0c;记录一下&#xff1a; 参考资料链接&#xff1a;让你完全理解linux内核设备树ranges属性地址转换 - vkang - 博客园 (cnblogs.com) ranges属性定义如下&#xff1a; ranges < local_address pa…

SAP专家级实施商解读:SAP S/4HANA Cloud(PCE私有云) 的五大误解

五个关于SAP S/4HANA Cloud&#xff08;PCE私有云&#xff09;的重要疑问&#xff1a; ■ SAP太贵了&#xff1f; ■ SAP S/4HANA Cloud 只适用于大型企业&#xff1f; ■ ERP项目&#xff0c;尤其是 SAP 解决方案&#xff0c;太耗时了&#xff1f; ■ ERP项目/云项目没有优势&…

Stream流对list<map>的操作

Map<String,Object> map new HashMap<>();map.put("name","张三");map.put("age","30");map.put("sex","男");map.put("addr","深圳");List<Map<String,Object>> l…

mysql基础8——聚合函数

求和函数 sum() 返回指定字段值的和 获取某个门店每天每种商品的销售总计情况 select left(b.transdate,10).c.goodsname,sum(a.quantity),sum(a.salesvalue) from demo.transactiondetails as a join demo.transactionhead as b on (a.transactionidb.transactionid) join …

JAVA学习笔记29(集合)

1.集合 ​ *集合分为&#xff1a;单列集合、双列集合 ​ *Collection 接口有两个重要子接口 List Set&#xff0c;实现子类为单列集合 ​ *Map接口实现子类为双列集合&#xff0c;存放的King–Value ​ *集合体系图 1.1 Collection接口 1.接口实现类特点 1.collection实现…

PL_to_PS中断传输数据

PL_to_PS中断传输数据 实验功能&#xff1a;将PL端的数据存入BRAM&#xff0c;然后在PS端读出数据&#xff0c;用串口打印。通过中断来触发 参考文章&#xff1a; https://www.cnblogs.com/fhyfhy/p/11760986.html [ZYNQ_PS与PL通过BRAM交互&#xff08;三&#xff1a;PSPL读…

JAVA每日经典面试题

Java 高级面试问题及答案 问题1: 在Java中&#xff0c;什么是强引用、软引用、弱引用和虚引用&#xff1f;它们之间有什么区别&#xff1f; 答案: 在Java中&#xff0c;引用分为四种类型&#xff1a; 强引用&#xff1a;如果对象具有强引用&#xff0c;那么它永远不会被垃圾…

用Python设计一个计算器

Python代码 import tkinter as tk# 定义按钮点击事件处理函数,用于将按钮对应的数字或运算符添加到当前表达式中 def button_click(number):current = entry.get() # 获取当前文本框中的内容entry.delete(0, tk.END) # 清空文本框

MyBatis 框架学习(II)

MyBatis 框架学习(II) 文章目录 MyBatis 框架学习(II)1. 介绍2. 准备&测试2.1 配置数据库连接字符串和MyBatis2.2 编写持久层代码 3. MyBatis XML基础操作3.1 Insert 操作3.2 Delete 操作3.3 Update 操作3.4 Select 操作 4. #{} 与 ${}的使用5. 动态SQL操作5.1 < if >…