@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>
# @Primary
1. 当多个相同类型Bean满足注入条件时,@Primary 优先
<a name="mHlFO"></a>
# @Lookup
```java
@Component
public abstract class LookupC {
@Lookup
public abstract LookupA getLookupA() ;
@Lookup
public LookupA getLookupA1(){
return null;
}
}
@Component
public abstract class LookupC {
@Lookup
public abstract LookupA getLookupA() ;
@Lookup
public LookupA getLookupA1(){
return null;
}
}
abstract
类是不可以注入的,但是若里面有了@Lookup
,也可以注入- 可以声明为
abstract
或正常方法 - 可以解决原型bean的注入问题(每次都注入新的)