@Value

image.png

${}:用于读取properties中的值
#{}:可设置SpEL表达式,可以完成依赖注入的功能

@Bean

  1. autowire属性
    1. 可以为有set的属性赋值自动赋值,不需要@Autowired
    2. byName:是根据set方法的参数名进行注入
    3. byType:是根据set方法的参数类型注入
  2. autowireCandidate=false
    1. 指定bean不能被其他类依赖注入
  3. 自定义符合注解

image.png

@ComponentScan

  1. includeFilters:扫描符合某种条件下的类作为我们的bean

image.png
这样可以使自定义注解和@Component有同样的效果

  1. excludeFilters:符合某种条件就不能成为我们的Bean

image.png

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

image.png
image.png

@Conditional

image.png
image.png

@Autowired

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

image.png

  1. 对static方法和字段是无效的

    @Resource

  2. 先byName后byType

  3. 指定name或type,就只会按照name或type

    @Lazy

  4. 用Bean的时候才会去创建

  5. 某个@Autowired字段上加,会赋给字段一个代理对象,只有在用到的时候才会赋值
  6. 可以解决@Aync循环依赖问题
  7. 可以加在构造方法上(任意一方头上即可),解决循环依赖

    @Configuration

  8. 通过@Configuration标识的Bean会去读取@Bean配置

  9. 通过@Import引入的Bean会去读取Bean中的@Bean配置
  10. 通过@Bean定义的Bean,里面的@Bean 不会生效

    @Import

    image.png

  11. 导入的类作为一个配置Bean存在

  12. 注册的beanName不是首字母小写的,是类全路径名
  13. 引入ImportSelector类,返回要注册到容器的class的名字

image.png
image.png

  1. 引入DefferImportSelector,和ImportSelector差不多,执行时机不太一样而已
  2. 引入ImportBeanDefinitionRegister,注册一个BeanDefinition ```java public class CustomerImportBeanDefinition implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanFactoryAware {

    private BeanFactory beanFactory; private ResourceLoader resourceLoader;

    @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

    1. this.beanFactory = beanFactory;

    }

    @Override public void setResourceLoader(ResourceLoader resourceLoader) {

    1. this.resourceLoader = resourceLoader;

    }

    @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {

    1. //扫描指定内容,到 registry

    /* MyClassPathBeanDefinitionScanner scanner = new MyClassPathBeanDefinitionScanner(registry, false);

    1. scanner.setResourceLoader(resourceLoader);
    2. scanner.registerFilters();
    3. scanner.doScan("com.gao.annotest.impt");*/
    4. //手动注册
    5. BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();
    6. AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
    7. beanDefinition.setBeanClass(SelectedBean2.class);
    8. registry.registerBeanDefinition("seelctedBean2",beanDefinition);

    }

    @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

    } }

  1. <a name="GUIN4"></a>
  2. # @Primary
  3. 1. 当多个相同类型Bean满足注入条件时,@Primary 优先
  4. <a name="mHlFO"></a>
  5. # @Lookup
  6. ```java
  7. @Component
  8. public abstract class LookupC {
  9. @Lookup
  10. public abstract LookupA getLookupA() ;
  11. @Lookup
  12. public LookupA getLookupA1(){
  13. return null;
  14. }
  15. }
  16. @Component
  17. public abstract class LookupC {
  18. @Lookup
  19. public abstract LookupA getLookupA() ;
  20. @Lookup
  21. public LookupA getLookupA1(){
  22. return null;
  23. }
  24. }
  1. abstract类是不可以注入的,但是若里面有了@Lookup,也可以注入
  2. 可以声明为abstract或正常方法
  3. 可以解决原型bean的注入问题(每次都注入新的)