Spring注解开发(三)—— Bean属性赋值
赋值方式
- 使用@Value 基础数值 可以使用SpEL表达式“#{20-2}” 可以使用${};取出@PropertySource() 指定的属性文件值(即在运行环境变量的值)
自动装配
自动装配;Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;
- @Autowired:自动注入: 默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class); 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean(“beanName”) @Qualifier(“beanName”):使用@Qualifier指定需要装配的组件的id,而不是使用属性名| 自动装配:默认一定要将属性复制好,否则就会报错 @Autowired(required=false)设置为非必须, @Primary:让Spring进行自动装配的时候,默认使用首选的bean; 也可以继续使用@Qualifier指定需要装配的bean的名字 BookService{ @Autowired BookDao bookDao; }
- Spring还支持使用@Resource(JSR25e)和@Inject(JSR33e)[java规范的注解] @Resource:可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;没有能支持@Primary功能没有支持@Autowired(reqiured=false); @Inject:需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;
@Autowired:Spring定义的;@Resource、@Inject都是java规范
AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能;
3)@Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
- 标注在方法位置:Spring容器创建当前对象,就会调用方法,完成方法的参数赋值; @Bean标注的方法创建对象的时候,方法参数的值从容器中获取;@Bean+方法参数,默认不写@Autowired
- 标注在构造器:默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作 如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件可以从Ioc容器中自动获取
- 标注在参数位置:
- 自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx) 自定义组件需要实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware 把Spring底层一些组件注入到自定义的Bean中; xxxAware:功能使用xxxProcessor实现的; ApplicationContextAware==》ApplicationContextAwareProcessor;
@Profile使用
@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件
- 加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
- 写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
- 没有标环境标识的bean,同时在类上也没有指定环境,在任何环境下都是加载的;
指定环境标识的方式:
- 使用命令行动态参数:在虚拟机参数位置加载-Dspring.profiles.active=test
- 代码的方式激活某种环境; @Test public void testel(){ AnnotationConfigApplicationContext applicationContext= new AnnotationConfigApplicationcontext(); //1、创建一个applicationcontext //2、设置需要激活的环境 applicationContext.getEnvironment().setActiveProfiles("de"); //3、注册主配置类 applicationContext.register(MainConfigofProfile.class); //4、启动刷新容器 applicationContext.refresh(); ... }
上一篇:
IDEA上Java项目控制台中文乱码