Spring注解驱动开发——自动装配 Aware注入Spring 底层组件&原理

1丶自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware;

把Spring底层的一些组件注入到自定义的Bean中;

xxxAware: 功能使用xxxProcessor;
 ApplicationContextAware==>ApplicationContexttAwareProcessor;

组件类

测试注入用XXXAware 注入 Spring 底层组件

package com.mongoubiubiu.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.stereotype.Component;
import org.springframework.util.StringValueResolver;

@Component("aasdasd")
public class Red implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware{
    
    
    private ApplicationContext applicationContext;

    //实现ApplicationContextAware 接口  该方法会自动把ioc 容器注入进来
    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        // TODO Auto-generated method stub
        this.applicationContext=arg0;
        System.out.println("传入的ioc 容器为"+arg0);
    }
    
   /**
    * 自动把当前容器的名字注入进来
    */
    @Override
    public void setBeanName(String name) {
      System.out.println("当前容器bean 的名字"+name);        
    }
  /**
   *  ioc容器会自动把值解析器传进来
   */
  @Override
  public void setEmbeddedValueResolver(StringValueResolver arg0) {
      //取出环境变量中的 信息,SpEL;
    String resolveString=  arg0.resolveStringValue("你好${os.name} 我是#{20*18}");
    System.out.println("解析的字符串为:"+resolveString); 
  }

}

用包扫描的方式 将Red组件 注入到ioc容器中

测试类

package com.mongougbiubiu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import com.mongoubiubiu.bean.Boss;
import com.mongoubiubiu.bean.Car;
import com.mongoubiubiu.bean.Color;
import com.mongoubiubiu.bean.Red;
import com.mongoubiubiu.conf.MainConfigOfAutowired;
import com.mongoubiubiu.conf.MainConfigOfLifeCycle;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

public class IOCTest_Autowired {
    
    
    @Test
    public void Test01(){
        //创建ioc 容器
        AnnotationConfigApplicationContext applica=    new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        //UserService userService=applica.getBean(UserServiceImpl.class);
        System.out.println(applica);

    } 

}

测试

 

 发现当前bean的名字 确实是@Component 里面的value 值   2个ioc 容器对象也相等

 

posted @ 2021-08-09 23:01  KwFruit  阅读(70)  评论(0编辑  收藏  举报