_@_Bean

给容器注册一个Bean;类型为返回值的类型,id默认是用方法名作为id.

_@_Configuration

相当于配置文件,即告诉spring这个一个配置类。

_@_ComponentScan

自动包扫描注解
value:指定要扫描的包
excludeFilters=Filter[ ] 指定扫描的时候按照什么规则排除哪些组件。
includeFilters=Filter[ ] 指定扫描的时候只需要包含哪些组件。(注意的是包扫描默认的是扫描所有的,也就是use-default-filters=”true”,所以需要设置为false。 这个和配置文件一样)
FilterType.ANNOTATION :按照注解的方式
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则。 使用这个需要是TypeFilter的实现类
FilterType.CUSTOM使用案例:

  1. public class MyTypeFilter implements TypeFilter {
  2. /**
  3. * metadataReader:读取到的当前正在扫描的类的信息
  4. * metadataReaderFactory:可以获取到其他任何类信息的
  5. */
  6. @Override
  7. public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
  8. throws IOException {
  9. // 获取当前类注解的信息
  10. AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
  11. // 获取当前正在扫描的类的类信息
  12. ClassMetadata classMetadata = metadataReader.getClassMetadata();
  13. // 获取当前类资源(类的路径)
  14. Resource resource = metadataReader.getResource();
  15. String className = classMetadata.getClassName();
  16. System.out.println("--->" + className);
  17. if (className.contains("er")) {
  18. return true;
  19. }
  20. return false;
  21. }
  22. }
  1. @Configuration
  2. @ComponentScans(value={
  3. @ComponentScan(value="cn.carven",
  4. includeFilters={
  5. @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
  6. },useDefaultFilters=false)
  7. })
  8. public class MainConfig {
  9. @Bean("person")
  10. public Person person12() {
  11. return new Person("李四", 12);
  12. }
  13. }

_@_ComponentScans

这个就是多个scan的几个集合,也就是可以定义多个规则。 如果是jdk1.8以后的,本身也是可以多些几次scan。 不用scans也可以

_@_Scope 作用范围

prototype 多实例的 备注:IOC容器启动并不会去调用方法创建对象放在容器中,而是在每次获取的时候才会调用方法创建对象,且每次创建的都是一个新的,即多实例。
singleton 单实例的(默认值) 备注:默认在单实例的情况下,IOC容器启动的时候会调用方法创建对象,放入iOC容器中。 以后每次获取就是从容器中拿,即对象都是一个。
request 同一次请求创建一个实例(web环境中才能用到,且基本不用)
session 同一个session创建一个实例(web环境中才能用到,且基本不用)

_@_Lazy

懒加载,针对单实例的bean
懒加载:容器启动不创建对象。第一次使用(获取bean)创建的对象,并初始化。

_@_Conditional

按照一定的条件进行判断,满足条件给容器中注册bean。可注解在类或方法上

  1. /**
  2. * 判断是否为window系统
  3. *
  4. * @author LaiMingBin
  5. */
  6. public class WindowCondition implements Condition {
  7. /**
  8. * ConditionContext 判断条件能使用的上下文(环境)
  9. * AnnotatedTypeMetadata 注释信息
  10. */
  11. @Override
  12. public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
  13. // 能获取到IOC使用的beanFactory
  14. ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
  15. // 获取类加载器
  16. ResourceLoader resourceLoader = conditionContext.getResourceLoader();
  17. // 获取当前环境信息
  18. Environment environment = conditionContext.getEnvironment();
  19. // 获取bean定义的注册类
  20. BeanDefinitionRegistry registry = conditionContext.getRegistry();
  21. String property = environment.getProperty("os.name");
  22. return property.contains("Window");
  23. }
  24. }

_@_Import

@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
ImportSelector:返回需要导入的组件的全类名数组;
ImportBeanDefinitionRegistrar:手动注册bean到容器中

FactoryBean方式

Bean生命周期

Bean生命周期 创建—初始化—销毁的过程
容器管理bean的生命周期;我们可以自定义初始化和销毁方法;
构造(对象创建)

  1. 单实例: 在容器启动的时候创建对象
  2. 多实例: 在每次获取的时候创建对象

初始化:

  1. 对象创建完成,并赋值好,调用初始化方法

销毁:

  1. 单实例:容器关闭的时候
  2. 多实例:容器不会管理这个bean;容器不会调用销毁方法

方式一:

_@_Bean(initMethod = “方法名” ,destroyMethod = “方法名”)

方式二:

通过实现接口InitializingBean(初始化), DisposableBean(销毁)的方式

方式三:

可以使用JSR250
@PostConstruct:在bean创建完成,并且属性赋值完成,来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作

方式四:

BeanPostProcessor后置处理器接口:
postProcessBeforeInitialization: 在其他初始化方法之前工作,如init-method,afterPropertiesSet
postProcessAfterInitialization(销毁): 在其他初始化之后工作