Administrator
发布于 2022-12-09 / 38 阅读
0
0

Spring注解驱动---属性赋值 && 自动装配

属性赋值

通过@Value来给变量赋值

使用@Value赋值:

1、基本数值

2、可以写spEL; #{}

3、可以写${}; 取出配置文件【properties】中的值(在运行环境变量里面的值)

eg:

    @Value("1")
    private String id;

    @Value("${person.name}")
    private String name;
    @Value("#{20-2}")
    private Integer age;

使用配置文件要在配置类上加上配置文件的位置

 //使用@PropertySource读取外部配置文件中的K/V,保存到运行的环境变量中;
//加载完外部的配置文件以后使用${}取出配置文件的值
@PropertySource("classpath:/person.propertites")

PropertySource是可重复注解,可以写多个

因为配置文件的内容都会保存到运行环境中,所以也可以这么获取:

context是容器

        String s = context.getEnvironment().getProperty("person.name");
        System.out.println(s);

自动装配

@Autowired&@Qualifier&@Primary

自动装配:Spring利用依赖注入(DI),完成对ioc容器中各个组件的依赖关系赋值

@Autowired自动装配
1、自动装配会优先按照类型去容器中找对应的组件
【applicationContext.getBean(Dog.class)】
2、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
【applicationContext.getBean(“dog”);】

@Primary,让Spring进行自动装配的时候,默认优先装配哪个bean

@Qualifier,来指定需要装配的组件的id,而不是使用一开始默认的属性名

通过@Autowired,来自动装配bean对象,自动赋值一定要讲属性赋值好,没有会报错

可以使用 @Autowired(required = false) 来设定非必须

这里有个问题:@Autowired自动装配,如果自己在有多个bean的情况下显示调用applicationContext.getBean(Dog.class)会抛异常,因为你有多个但你只接收一个。

@Resource&@Inject&@Autowired

@Resource(JSR250)和@Inject(JSR330) 【都是java规范的注解】

@Resource:

可以和@AutoWired一样实现自动装配功能;默认是按照组件名称进行装配的
不支持@Primary功能、@Autowired(required=false)

@Inject:

需要导入【javax inject】依赖才能使用,和 @AutoWired的功能一样。没有required=false的功能

@Autowired:

功能强大,支持自动装配,有required=false功能,支持@Primary功能
但只能使用于Spring框架

使用哪个看公司的要求和个人爱好吧!关于@Autowired还有个隐藏问题写在了@Autowired注解那篇里了

构造器、参数、方法的自动装配

@Autowired:构造器、参数、方法、属性都可标注;都是从ioc容器中获取

1、标注在方法位置:

@Bean + 方法参数:参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配

2、标注在构造器上;

如果组件只有一个有参构造器(指没有无参构造器,一个有参构造器),这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取

3、标注在参数上

@Autowired的内容还是可以看看这个标签下的第一篇文章

Aware注入Spring底层组件&原理

自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,…)

自定义组件可以通过实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关的组件;Aware

xxxAware:功能使用xxxProcessor,如:

ApplicationContextAware ===> ApplicationContextAwareProcessor

每一个Aware都有对应的Processor

@Profile

@Profile,指定组件在哪个环境下才能被注册到容器中

1、加了@Profile环境标识的bean,只有这个环境被激活的时候才能注册到容器当中。默认是default环境

2、当@Profile写在配置类上,只有指定的环境的时候,整个配置类里面的所有配置才能开始生效

3、没有标注@Profile环境标识的bean,在任何情况下都加载

评论