SpringBoot容器--注解的使用(下)

简介: SpringBoot容器--注解的使用(下)

@Import


应用实例


说明: 演示在SpringBoot, 如何通过@Import 来注入组件


创建quickstart\src\main\java\com\nlc\springboot\bean\Cat.java

public class Cat {
}


创建quickstart\src\main\java\com\nlc\springboot\bean\Dog.java

public class Dog {
}


  1. 修改BeanConfig.java 通过@Import 注入组件
/**
* Import 可以传入一个数组,可以一次注入多个组件
* public @interface Import {
* Class<?>[] value();
* }
* 注意@Import 方式注入的组件, 默认组件的名字就是全类名
*/
@Import({Dog.class, Cat.class})
// @Configuration//标识这是一个配置类: 等价配置文件
@Configuration(proxyBeanMethods = false)
public class BeanConfig {
}


  1. 修改MainApp.java 完成测试
public static void main(String[] args) {
        //启动springboot应用程序/项目
        ConfigurableApplicationContext ioc =
                SpringApplication.run(MainApp.class, args);
      Dog dogBean = ioc.getBean(Dog.class);
        Cat catBean = ioc.getBean(Cat.class);
        System.out.println("dogBean--" + dogBean);
        System.out.println("catBean--" + catBean);
}

默认类型导入是单例的,如果有多个同类型bean就会报错。


@Conditional


@Conditional 介绍


  1. 条件装配:满足Conditional 指定的条件,则进行组件注入
  2. @Conditional 是一个根注解,下面有很多扩展注解

image.png

image.png


应用实例


  1. 要求: 演示在SpringBoot, 如何通过@ConditionalOnBean 来注入组件
  2. 只有在容器中有name = monster_nmw 组件时,才注入dog01, 代码如图

09c1a8bf458ccc9bbfd4ed4f209be47c.png

@Bean
public Dog dog01() {
  return new Dog();
}
  1. 先测试下,当前是否能注入dog01

a943e39c9b107ef32111c49299a062f1.png

System.out.println("容器是否注入了dog01= " + ioc.containsBean(“dog01”));

4.修改BeanConfig.java , 加入@ConditionalOnBean 条件约束,并完成测试

@Import({Dog.class, Cat.class})
// @Configuration//标识这是一个配置类: 等价配置文件
@Configuration(proxyBeanMethods = false)
//设置每次获取bean都创建新的,要符合条件才生效
public class BeanConfig {
    /**
    * 1. @Bean : 给容器中添加组件
    * 2. monster01() : 默认方法名作为组件的id
    * 3. Monster: 返回类型就是组件类型, 返回的值就是new Monster(100, "牛魔王", 500, "
    芭蕉扇")
    * 4. @Bean("monster_nmw"): 重新指定组件的id = “monster_nmw”
    * 5. 配置类里面使用@Bean 标注在方法上给容器注册组件,默认是单实例的
    */
    // @Bean("monster_nmw")
    @Bean
    public Monster monster01() {
    return new Monster(100, "牛魔王", 500, "芭蕉扇");
    }
    /**
    * @ConditionalOnBean(name = "monster_nmw"):
    * 1. 表示只有容器中注入了name = monster_nmw 的组件,下面的组件(dog01)才会被注入
    * 2. @ConditionalOnBean(name = "monster_nmw") 也可以放在类名处,
    * 则表示对该配置类中所有要注入的组件都进行条件约束
    * 3. 还有很多其它条件约束注解,用到时在讲解.
    */
    @ConditionalOnBean(name = "monster_nmw")
    @Bean
    public Dog dog01() {
      return new Dog();
    }
}

自己测试,打开注解,看是否注入。


@ImportResource


作用:原生配置文件引入, 也就是可以直接导入Spring 传统的beans.xml ,可以认为是SpringBoot 对Spring 容器文件的兼容.


@ImportResource 应用实例


  1. 需求: 将beans.xml 导入到BeanConfig.java 配置类, 并测试是否可以获得beans.xml注入/配置的组件


将beans.xml放在resource资源目录下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--配置了Monster bean-->
    <bean id="monster03" class="com.nlc.springboot.bean.Monster">
        <property name="name" value="牛魔王~"></property>
        <property name="age" value="5000"></property>
        <property name="skill" value="芭蕉扇~"></property>
        <property name="id" value="1000"></property>
    </bean>
</beans>


  1. 修改BeanConfig.java / 或者创建新的BeanConfig3.java(建议创建新的配置类) 来测试,使用@ImportResource 导入beans.xml
//外部导入bean
@Import({Dog.class, Cat.class})
// @Configuration//标识这是一个配置类: 等价配置文件
@Configuration(proxyBeanMethods = false)
//导入beans.xml
@ImportResource("classpath:beans.xml")
public class BeanConfig {
}


  1. 在MainApp.java 测试
public static void main(String[] args) {
    ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);
    System.out.println("容器是否注入了dog01= " + ioc.containsBean("dog01"));
    System.out.println("monster03: " + ioc.containsBean("monster03"));
    System.out.println(ioc.getBean("monster03"));
}


配置绑定


说明:使用Java 读取到SpringBoot 核心配置文件application.properties 的内容,并且把它封装到JavaBean 中


应用实例


  1. 需求: 将application.properties 指定的k-v 和JavaBean 绑定
#默认server.port=8080
server.port=10000
#比如: 默认spring.servlet.multipart.max-file-size=1MB
#默认配置最终都是映射到某个类上,比如这里配置会映射到MultipartProperties
spring.servlet.multipart.max-file-size=10MB
#设置属性k-v
#前面的futn01用于指定/区分不同的绑定对象
furn01.id=100
furn01.name=soft_chair!!
furn01.price=45678.9


  1. 创建quickstart\src\main\java\com\nlc\springboot\bean\Furn.java
@Component
@ConfigurationProperties(prefix = "furn01")
//指定前缀。以 前缀匹配properties 文件的值,将值注入bean
/**
 * 说明:
 * 1. Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}
 * 2. @Data 注解等价使用了 如下注解 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
 */
//@Data
//说明: @NoArgsConstructor 在编译时,会生成无参构造器, 前面说过,默认情况下,会生成一个无参构造器
//说明:当我们有其它构造器生成时,如果你希望仍然有无参构造器就需要使用@NoArgsConstructor指定一下,否则就会覆盖无参构造器,从而代码错误
@NoArgsConstructor
//说明:@AllArgsConstructor 在编译时,会生成全参构造器
@AllArgsConstructor
//@ToString 在编译时,生成toString, 默认情况下,会生成一个无参构造器
@ToString
//生成所有的set/get方法
@Setter
@Getter
public class Furn {
    private Integer id;
    private String name;
    private Double price;
}


  1. 修改HelloController.java
@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
      return "hello, spring boot";
    }
    @Autowired
    Furn furn;
    @RequestMapping("/furn")
    @ResponseBody
    public Furn furn(){
      return furn;
    }
}


  1. 启动SpringBoot 主程序,测试

a331da1b0459d180fb9794c6b49cd524.png

如果测试时发现有结果为空,说明properties 文件的属性写错了。


配置绑定还有第2 种方式, 也给小伙伴演示下, 完成测试,效果一样, 注意: 注销@Component 需要在BeanConfig.java( 说明: 也可以是其它配置类) 配置@EnableConfigurationProperties(Furn.class), 否则会提示错误

5dda8cc96aef3446417c2ccd089920be.png

//@EnableConfigurationProperties(Furn.class)解读
//1、开启Furn 配置绑定功能
//2、把Furn 组件自动注册到容器中
@EnableConfigurationProperties(Furn.class)
public class BeanConfig {
}

f72c6dba01cb3705170d3d78b3b81c20.png


注意事项和细节


1.如果application.properties 有中文, 需要转成unicode 编码写入, 否则出现乱码。可以使用unicode转码工具进行转换。

#设置属性k-v
furn01.id=100
furn01.name=soft_chair\u6c99\u53d1!!
furn01.price=45678.9


2.使用@ConfigurationProperties(prefix = “furn01”) 会提示如下信息, 但是不会影响使用

890b7faadca8ff18b31de1c644d98129.png


  1. 解决@ConfigurationProperties(prefix = “furn01”) 提示信息, 在pom.xml 增加依赖, 即可
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>


相关文章
|
2月前
|
Java 开发者 Spring
【SpringBoot 异步魔法】@Async 注解:揭秘 SpringBoot 中异步方法的终极奥秘!
【8月更文挑战第25天】异步编程对于提升软件应用的性能至关重要,尤其是在高并发环境下。Spring Boot 通过 `@Async` 注解简化了异步方法的实现。本文详细介绍了 `@Async` 的基本用法及配置步骤,并提供了示例代码展示如何在 Spring Boot 项目中创建与管理异步任务,包括自定义线程池、使用 `CompletableFuture` 处理结果及异常情况,帮助开发者更好地理解和运用这一关键特性。
125 1
|
2月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
2月前
|
缓存 Java 数据库连接
Spring Boot奇迹时刻:@PostConstruct注解如何成为应用初始化的关键先生?
【8月更文挑战第29天】作为一名Java开发工程师,我一直对Spring Boot的便捷性和灵活性着迷。本文将深入探讨@PostConstruct注解在Spring Boot中的应用场景,展示其在资源加载、数据初始化及第三方库初始化等方面的作用。
53 0
|
9天前
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot
|
8天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
9天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
22天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
2月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
2月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
2月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
下一篇
无影云桌面