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>


相关文章
|
14天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
97 26
|
17天前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
163 89
|
2月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
181 73
|
4天前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
33 16
|
2月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
60 21
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
2月前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
3月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
65 4
|
3月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
231 2
|
3月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
83 2