SpringBoot常用注解超全总结

本文详细介绍了SpringBoot中常用的注解,如@Configuration用于配置类,@Bean用于注册bean,@Import用于导入其他组件,@Conditional用于条件装配,以及Lombok的@Data和@Slf4j等。此外,还讨论了热部署的相关配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot常用注解


Configuration注解

在Spirng中可以通过xml将组件注册到ioc中,SpringBoot默认不支持xml文件,因此可以通过配置类的方式手动注册

1.首先定义两个pojo类并提供getter、setter方法

2.新建一个配置类

2.1 使用注解@Configuration标识该类为一个配置类

2.2在配置类的内部使用@Bean注解注册相应类

方法名相当于bean的id。

方法返回的值,就是组件在容器中的实例

@Configuration
public class myConfig {
    @Bean("newUser")
    public User user(){
        return new User();
    }

    @Bean
    public cat newCat(){
        return new cat();
    }
}

这里可以通过bean的name/value值指定组件名,也可以通过方法名称指定组件名

4.myConfig配置类本身也被注册到ioc容器中,这是因为@Configuration注解

内部集成了@Component注解

5.配置类本质

输出后的地址表明这个配置类所属的bean是一个代理对象,基于CGLIB字节码增强

注解的proxyBeanMethods属性

这个属性规定了每次从容器中获得的bean是单例的还是多例的

这个值默认为true,即单例bean

这个属性解决了组件依赖问题:

单例模式下,从ioc中直接获取bean和调用getCat方法获取的bean是同一个bean

在多例模式下则每次都会获得新创建的bean

总结:

proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例
的】
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
组件依赖必须使用Full模式默认。其他默认是否Lite模式

@Import注解

1.向容器中导入一个组件

1.1在config文件中导入普通组件@Import(value={Animal.class})

​ 向容器中导入Animal类型的组件,名称为Animal的全限定名

注意:和使用bean注解注册没有区别,只是import方便些

@Configuration
@Import(value = {cat.class})
public class myConfig {
}

1.2 导入@Configuration注解修饰的类,用法与1.1相同@Import(value={Animal.class,myConfiguration.class})

工作中很常用,用于总配置类导入子配置类,当子配置类在包扫描范围之外时有用,也就是SpringBootApplicaion注解标识类的相应扫描范围

		--newConfig--
@Configuration
@Import({demo1.class})
public class newConfig {
}

		--myConfig--
@Configuration
@Import(value = {newConfig.class})
public class myConfig {
}

1.3 ImportSelector接口实现的类被导入

​ 1.3.1创建 一个类,实现 ImportSelector 接口,并重写 selectImports 方法,方法返回的是需要导入类的全限定名的数组。

			--ImportSelector--
public class ImportSelector implements org.springframework.context.annotation.ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{demo1.class.getName(), cat.class.getName()};
    }
}

			--myConfig--
@Configuration
@Import(value = {ImportSelector.class})
public class myConfig {
}

1.4 实现ImportBeanDefinitionRegistrar接口

1.4.1 创建一个需要导入的bean

public class demo2 {
    public demo2() {
        System.out.println("demo2");
    }
}

1.4.2 创建一个类,实现ImportDefinitionRegistrar接口

public class ImportDef implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean flag = registry.containsBeanDefinition(demo2.class.getName());
        //containsBeanDefinition:判断容器中是否存在指定的 bean 定义,true 存在
        if(!flag){
            RootBeanDefinition beanDefinition=new RootBeanDefinition(demo2.class);
            //注册BeanDefinition,并指定 beanName
            registry.registerBeanDefinition("demo",beanDefinition);
        }
    }
}

1.4.3 在配置类中导入这个类

@Configuration
@Import(value = {ImportDef.class})
public class myConfig {
}

@Conditional注解

当我们需要在满足特定条件时再加载bean时,可以用到条件装配。ConditionalOnxxx意味着满足xxx时才将该注释下的所有bean装配到ioc容器中

@Target:说明spring自动扫描的所有类(包括@Configuration、@Component、@Service等)都可以通过添加@ConditionalOnxxx来进行条件装配。并且可以用在方法上,所以有@Bean注解标记的方法也可以应用条件装配注解

都是用了 @Conditional 注解来标记,OnBeanCondition 等自定义 Condition 还是实现了
Condition 接口的,换汤不换药,没什么神秘的,只不过做了更具象的封装罢了。

多个conditonal的作用:见spingboot课件

@Configuration
@Import({demo1.class})
public class AnewConfig {
}


@Configuration
@ConditionalOnBean(name = "com.xq.pojo.demo1")
@Import(value = {ImportDef.class})
public class myConfig {
    @Bean("tri-by-demo1")
    public User user(){
        return new User();
    }
}
注意

这里配置类有加载顺序,默认按照类的首字母加载,但是最终都能加载上

改进方法
  1. 使用@Order注解

    @Configuration
    @Order(1)
    public class NewConfig {
        @Bean
        public demo1 demo1(){
            return new demo1();
        }
    }
    

2.使用@DependsOn注解

@ImportResource注解

SpringBoot默认不支持xml配置文件,如果强行使用则可以在启动类\controller中使用该注解

@RestController//@Controller + @ResponseBody("将返回值作为json字符串传递给浏览器")
@ImportResource("classpath:bean.xml")//类路径中寻找
public class newController {
    @Autowired
    newSer newSer;
    @RequestMapping("add")
    public String add(){
        newSer.addUser();
        return "add"+newSer;
    }
}

或者在启动类上导入

@SpringBootApplication
@ImportResource("classpath:bean.xml") //导入XML配置文件
public class App {
public static void main(String[] args) {
//获得ioc容器
ConfigurableApplicationContext context =
SpringApplication.run(App.class, args);
User user = context.getBean(User.class);
System.out.println(user);
}
}

在resource下配置xml文件即可

属性注入

需要在application.properties(固定)中配置

1.使用value注解进行注入
		--Car--
@Component
public class Car {
    @Value("${car.name}")
    String name;
    @Value("${car.price}")
    String price;
}
		--controller--	
@Autowired
    Car car;
    @RequestMapping("car")
    public Car car(){
        return car;
    }
  • 注意不要忘记@Component
2.使用批量处理注册

这里可以省去手动使用@Value注解的麻烦

需要两个注解

  1. @ConfigurationProperties注解在Car类上,标注前缀来匹配Car类的字段

    @ConfigurationProperties(prefix = "car")
    public class Car {
        String name;
        String price;
    }
    
  2. @EnableConfigurationProperties注解标注在配置类上,表示开启某个类的属性配置

    @Configuration
    @EnableConfigurationProperties(Car.class)
    public class NewConfig {
    }
    

开发技巧

lombok插件

1.首先导入lombok依赖,springboot已经对lombok进行版本管理,无需指定版本

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2.使用方法:

2.1 @Data使用/GetterSettertoString方法的自动构建

@Data
public class newClass {
    public String username;
    public String password;
    public Integer age;
}

​ @Data注解将帮用户自动定义getter & Setter & toString方法

public class newTest {
    public static void mian(String[] args) {
        newClass aClass=new newClass();
        aClass.setAge(9);
    }
}

2.2 构造方法的自动构建

​ 2.21@AllArgsConstructor

@AllArgsConstructor
public class newClass {
    public String username;
    public String password;
    public Integer age;
}

​ @AllArgsConstructor注解将自动构建带有全部参数的构造方法

public class newTest {
    public static void mian(String[] args) {
        newClass aClass=new newClass("eric","pwd",13);
    }
}

​ 注意只能是全部参数,缺省参数会报错

newClass aClass=new newClass("eric","pwd");//报错

​ 2.22

​ @NoArgsConstructor自动构造无参构造函数


@NoArgsConstructor
public class newClass {
    public String username;
    public String password;
    public Integer age;
}
public class newTest {
    public static void mian(String[] args) {
        newClass newClass = new newClass();
    }
}
slf4j注解
  • 注意slf4j注解为lombok插件支持的功能,必须导入lombok插件

加入该注解后可以直接使用内置log对象

@Slf4j
@RestController
public class newController {
    @Autowired
    newSer newSer;
    @RequestMapping("add")
    public String add(){
        log.info("added"+newSer);//slf4j内置对象
        newSer.addUser();
        return "add"+newSer;
    }
}

热部署

​ 引入热部署依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

​ 引入热部署插件

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>

以后修改配置直接构建即可,不需要重启服务器

注意:更改依赖需要重启服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值