@Value

${}:用于读取properties中的值
#{}:可设置SpEL表达式,可以完成依赖注入的功能
@Bean
- autowire属性
- 可以为有set的属性赋值自动赋值,不需要
@Autowired - byName:是根据set方法的参数名进行注入
 - byType:是根据set方法的参数类型注入
 
 - 可以为有set的属性赋值自动赋值,不需要
 - autowireCandidate=false
- 指定bean不能被其他类依赖注入
 
 - 自定义符合注解
 
@ComponentScan
- includeFilters:扫描符合某种条件下的类作为我们的bean
 

这样可以使自定义注解和@Component有同样的效果 
- excludeFilters:符合某种条件就不能成为我们的Bean
 

- 扫描索引:很多类,好多工具类,Bean很少,但是会全扫。META-INF/spring.component
 
@Conditional


@Autowired
- 先byType后byName
 - 在字段、方法上类似(按1规则注入)
 - @Autowired写在构造方法上,指定Bean实例化的构造器
 - 写在方法参数中是基本上无用的
 - 自定义注解
 

- 
@Resource
 先byName后byType
- 
@Lazy
 用Bean的时候才会去创建
- 某个@Autowired字段上加,会赋给字段一个代理对象,只有在用到的时候才会赋值
 - 可以解决@Aync循环依赖问题
 - 
@Configuration
 通过@Configuration标识的Bean会去读取@Bean配置
- 通过@Import引入的Bean会去读取Bean中的@Bean配置
 - 
@Import

 导入的类作为一个配置Bean存在
- 注册的beanName不是首字母小写的,是类全路径名
 - 引入
ImportSelector类,返回要注册到容器的class的名字 


- 引入
DefferImportSelector,和ImportSelector差不多,执行时机不太一样而已 引入
ImportBeanDefinitionRegister,注册一个BeanDefinition ```java public class CustomerImportBeanDefinition implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanFactoryAware {private BeanFactory beanFactory; private ResourceLoader resourceLoader;
@Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
//扫描指定内容,到 registry
/* MyClassPathBeanDefinitionScanner scanner = new MyClassPathBeanDefinitionScanner(registry, false);
scanner.setResourceLoader(resourceLoader);scanner.registerFilters();scanner.doScan("com.gao.annotest.impt");*///手动注册BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();beanDefinition.setBeanClass(SelectedBean2.class);registry.registerBeanDefinition("seelctedBean2",beanDefinition);
}
@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
} }
<a name="GUIN4"></a># @Primary1. 当多个相同类型Bean满足注入条件时,@Primary 优先<a name="mHlFO"></a># @Lookup```java@Componentpublic abstract class LookupC {@Lookuppublic abstract LookupA getLookupA() ;@Lookuppublic LookupA getLookupA1(){return null;}}@Componentpublic abstract class LookupC {@Lookuppublic abstract LookupA getLookupA() ;@Lookuppublic LookupA getLookupA1(){return null;}}
abstract类是不可以注入的,但是若里面有了@Lookup,也可以注入- 可以声明为
abstract或正常方法 - 可以解决原型bean的注入问题(每次都注入新的)
 

