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 容器对象也相等