【SpringBoot 】 组件管理 ,java工程师面试突击中华石杉

@Autowired

private User user;

// …

}

@Configuration + @Bean 管理多个组件


在 springboot 中如果要管理 复杂对象 必须使用 @Configuration + @Bean 注解进行管理;

  • @Configuration 主要用来生产多个组件交给工厂管理 (注册形式)

1、管理复杂对象的创建

注意:这里的 User 不需要加 @Component 注解,与上面的管理单个对象区分开来。

@ToString

@AllArgsConstructor

@NoArgsConstructor

@Data

public class User {

private String id;

private String name;

}

@Configuration // @Component 也可以, 不推荐

public class BeanConfigs {

@Bean // @Bean 将当前返回值作为工厂中的一个对象进行管理

public User getUser() {

return new User();

}

@Bean //(name = “aaa”) // 用来将该方法的返回值交给springboot管理 在工厂中默认标识: 类名(首字母小写)

@Scope(“prototype”) // prototype表示多例; 默认是singleton, 单例的

public Calendar getCalendar() {

return Calendar.getInstance();

}

}

2、使用复杂对象

@RestController

@RequestMapping("/hello")

public class HelloController {

@Autowired

private User user;

@Autowired

private Calendar calendar1;

@Autowired

private Calendar calendar2;

@GetMapping("/hello")

public String hello() {

System.out.println(user); // 管理单个对象

// 管理多个对象, 默认是单例的, 需要设置 prototype

System.out.println(calendar1.getTime()); // 成功创建出对象

System.out.println(calendar1 == calendar2); // 默认是单例的, 需要设置 prototype 才为多例

return “hello spring boot!!!”;

}

属性注入

=======================================================================

SpringBoot 使用一个全局的配置文件,配置文件名是固定的:

  • application.properties

  • application.yml

配置文件的作用:修改 SpringBoot 自动配置的默认值;SpringBoot 在底层都给我们自动配置好了;

springboot 中提供了两种注入方式:基本属性注入对象注入

基本属性注入 @Value


基本属性包括:intStringDateString[]ListMap 等。

基本属性注入:使用注解 @Value("${xxx}")

@RestController

@RequestMapping(“hello”)

public class HelloController {

@Value("${server.port}")

private int port;

@Value("${str}")

private String str;

@Value("${bir}")

private Date bir;

@Value("${strs}")

private String[] strs;

@Value("${list}")

private List list;

@Value("#{${maps}}") // map注入取值有点特殊

private Map<String, String> maps;

@GetMapping(“hello”)

public String hello() {

// port = 8989

System.out.println("port = " + port);

// str = zhenyu

System.out.println("str= " + str);

// time = Wed Dec 12 12:12:12 CST 2012

System.out.println("time = " + bir);

// aa

// bb

// cc

for (String str : strs) {

System.out.println(str);

}

// zhangsan

// lisi

// wangwu

list.forEach( v -> System.out.println(v));

// k = aa, v = xiaoyi

// k = bb, v = xiaoer

// k = cc, v = xiaosan

maps.forEach((k, v) -> {

System.out.println("k = " + k + ", v = " + v);

});

return "hello sp

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

ring boot!";

}

}

application.properties 中配置:

server.port = 8989

属性注入

str = zhenyu

bir = 2012/12/12 12:12:12

strs = aa, bb, cc

list = zhangsan, lisi, wangwu

maps = {‘aa’:‘xiaoyi’, ‘bb’:‘xiaoer’, ‘cc’:‘xiaosan’}

对象方式注入 @ConfigurationProperties


对象方式注入使用注解:@ConfigurationProperties(prefix="前缀")

@ConfigurationProperties 告诉 SpringBoot 本类中的所有属性在配置文件中进行绑定;

  • 只有这个组件是容器中的组件,才能容器提供的 @ConfigurationProperties 功能,所以需要 @Component

@ToString

@Data // 必要

@Component // @Configuration 也可以

@ConfigurationProperties(prefix = “user”) // 必要

public class User {

private String id;

private String name;

private Integer age;

private Date bir;

}

控制器中使用:@Autowired 完成自动注入;

@RestController

@RequestMapping(“hello”)

public class HelloController {

@Autowired

private User user;

@GetMapping(“hello”)

public String hello() {

System.out.println(user);

// User(id=1721, name=yusael, age=20, bir=Wed Dec 12 12:12:12 CST 2012)

return “hello spring boot!”;

}

}

application.properties 中配置:

自定义对象属性注入

user.id = 1721

user.name = zhenyu

user.age = 20

user.bir = 2012/12/12 12:12:12


注:可以通过引入依赖 —— 配置文件处理器,构建自定义注入元数据。

  • 意思就是引入这个依赖后,在 配置文件中写注入对象会有提示,不引入也不影响什么。

org.springframework.boot

spring-boot-configuration-processor

true

两种注入方式比较


| | @ConfigurationProperties | @Value |

| — | — | — |

| 功能 | 批量注入配置文件中的属性 | 一个个指定 |

| 松散绑定(松散语法) | 支持 | 不支持 |

| SpEL | 不支持 | 支持 |

| JSR303 数据校验 | 支持 | 不支持 |

| 复杂类型封装 | 支持 | 不支持 |

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value

如果说,我们专门编写了一个 javaBean 来和配置文件进行映射,我们就直接使用@ConfigurationProperties

注入细节


配置文件注入值数据校验 @Validated

@Component

@ConfigurationProperties(prefix = “person”)

@Validated // 配置文件注入值数据校验

public class Person {

/**

  •  <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
    

*/

//lastName必须是邮箱格式

@Email

//@Value("${person.last-name}")

private String lastName;

//@Value("#{11*2}")

private Integer age;

//@Value(“true”)

private Boolean boss;

private Date birth;

private Map<String,Object> maps;

private List lists;

private Dog dog;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值