Spring注解的学习(三)——属性赋值与自动装配

一.属性赋值@Value

  1. 在以前的xml文件中,我们是直接在配置文件中进行属性配置的
  2. 在注解方式中,我们是使用@Value进行注解
    1. 普通赋值  @Value=(赋值内容)
    2. 表达式   #{}    @value=(“#{表达式}”)  
    3. 读取配置文件内容 ${} @Value=(#{配置文件key})

二.自动装配

1.什么是自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值。

2.自动装配有哪些:

   2.1.@AutoWired 自动注入

         2.1.1.先用@Service @Compnents@Dao结合包扫描将组件加载到容器中,然后使用@AutoWired取出对应的组件

原理:默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值。

     2.1.2.当然,如果同一个类型的bean有多个,那么如何进行唯一确定?这个时候,装载入IOC容器的时候,我们可以用@Bean(“bean名”)加载。然后注入的时候,我们可以用@Qualifier(“bean名”)来指定注入的组件id。 这里的原理其实就是applicationContext.getBean("beanID")

     2.1.3..注意:如果使用@AutoWired的话,如果对应的容器里面没有那种类型的bean的话,那么程序回报错。当然,如果没有的话,想要它输出为空的话,那么应该这样注解@AutoWired(required=false)

     2.1.4.像2.2.如果我们不使用@Qualifier 的话,我们注入Bean的话会使用默认同名的bean.那么如果我们要更改默认注入的bean的话,我们要怎么操作尼?这时候我们就使用到了注解@Primary来设置某个bean为该类bean的默认值

  2.2.使用@Resource注解和@Inject注解  使用方法了@AutoWired。不过@Resource无法和@Primary,@Qualifier结合使用;@Inject需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能

 2.3.事实上@AutoWired不仅可以注释在参数上,还可以注释在构造器,方法参数上。

 2.4.事实上,Spring本身就自带了很多容器。通过注入这些自带的容器我们可以获取到我们需要的相关信息,(1)例如下面举的例子:BeanNameAware 实现这个类的话可以获取当前类在IOC容器中的名字;ApplicationContextAware 实现这个类获取了当前的IOC容器;实现这个类的话,可以使用解析器(作用是解析配置文件内容等)

结果:(你好后面因为编码没调节原因变成了乱码)

3.对于上面的Bean,Spring 是如何将applicationContext对象注入到对应的Bean中的呢?

下面我们以上面截图的例子为例,在setApplicationContext方法上打上断点,下图是我们可以看到的方法栈。然后我们找到初始化前方法,这里可以看到,初始化前我们对当前Bean对象的一些操作。

这个时候我们具体看一下invokeAwareInterfaces方法的实现

这里看代码可以大概方法的作用,就是判断传入进来的bean是否属于某个特定的Aware的子类,是的话就把系统的applicationContext对象设置到该bean对象中。由于当前的bean的确属于某个特定的Aware的子类,因此这里就把系统的applicationContext对象注入进来了

 

由于实现了ApplicationContextAware是利用了ApplicationContextAwareProcessor来处理,而该类实现了BeanPostProcessor后置处理器,这里可以看看我上篇文章。有稍微介绍后置处理器的作用。

三.@Profile

当前环境被激活,属于当前环境的组件才能被放入到容器中。如果没有使用的话,默认所有bean都被注册到容器中。

用法:可以用在识别不同环境的不同使用:开发环境、测试环境、生产环境;例如下面的不用环境连接不同的数据库

那么如何判断当前环境呢?

  1. 设置当前运行环境的变量  使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
  2. 代码的方式激活某种环境;
AnnotationConfigApplicationContext applicationContext = 
				new AnnotationConfigApplicationContext();
		//1、创建一个applicationContext
		//2、设置需要激活的环境
		applicationContext.getEnvironment().setActiveProfiles("dev");
		//3、注册主配置类
		applicationContext.register(MainConfigOfProfile.class);
		//4、启动刷新容器
		applicationContext.refresh();

小知识:

1.默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作

2.如果A的构造方法注入了B,那么A中的B为啥不为空?一定比A先存在吗?————目前貌似的确如此,对于被引用的对象,系统似乎会优先创建并初始化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值