_@_Bean
给容器注册一个Bean;类型为返回值的类型,id默认是用方法名作为id.
_@_Configuration
_@_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使用案例:
public class MyTypeFilter implements TypeFilter {/*** metadataReader:读取到的当前正在扫描的类的信息* metadataReaderFactory:可以获取到其他任何类信息的*/@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)throws IOException {// 获取当前类注解的信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();// 获取当前正在扫描的类的类信息ClassMetadata classMetadata = metadataReader.getClassMetadata();// 获取当前类资源(类的路径)Resource resource = metadataReader.getResource();String className = classMetadata.getClassName();System.out.println("--->" + className);if (className.contains("er")) {return true;}return false;}}
@Configuration@ComponentScans(value={@ComponentScan(value="cn.carven",includeFilters={@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})},useDefaultFilters=false)})public class MainConfig {@Bean("person")public Person person12() {return new Person("李四", 12);}}
_@_ComponentScans
这个就是多个scan的几个集合,也就是可以定义多个规则。 如果是jdk1.8以后的,本身也是可以多些几次scan。 不用scans也可以
_@_Scope 作用范围
prototype 多实例的 备注:IOC容器启动并不会去调用方法创建对象放在容器中,而是在每次获取的时候才会调用方法创建对象,且每次创建的都是一个新的,即多实例。
singleton 单实例的(默认值) 备注:默认在单实例的情况下,IOC容器启动的时候会调用方法创建对象,放入iOC容器中。 以后每次获取就是从容器中拿,即对象都是一个。
request 同一次请求创建一个实例(web环境中才能用到,且基本不用)
session 同一个session创建一个实例(web环境中才能用到,且基本不用)
_@_Lazy
懒加载,针对单实例的bean
懒加载:容器启动不创建对象。第一次使用(获取bean)创建的对象,并初始化。
_@_Conditional
按照一定的条件进行判断,满足条件给容器中注册bean。可注解在类或方法上
/*** 判断是否为window系统** @author LaiMingBin*/public class WindowCondition implements Condition {/*** ConditionContext 判断条件能使用的上下文(环境)* AnnotatedTypeMetadata 注释信息*/@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {// 能获取到IOC使用的beanFactoryConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();// 获取类加载器ResourceLoader resourceLoader = conditionContext.getResourceLoader();// 获取当前环境信息Environment environment = conditionContext.getEnvironment();// 获取bean定义的注册类BeanDefinitionRegistry registry = conditionContext.getRegistry();String property = environment.getProperty("os.name");return property.contains("Window");}}
_@_Import
@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
ImportSelector:返回需要导入的组件的全类名数组;
ImportBeanDefinitionRegistrar:手动注册bean到容器中
FactoryBean方式
Bean生命周期
Bean生命周期 创建—初始化—销毁的过程
容器管理bean的生命周期;我们可以自定义初始化和销毁方法;
构造(对象创建)
单实例: 在容器启动的时候创建对象多实例: 在每次获取的时候创建对象
初始化:
对象创建完成,并赋值好,调用初始化方法
销毁:
单实例:容器关闭的时候多实例:容器不会管理这个bean;容器不会调用销毁方法
方式一:
_@_Bean(initMethod = “方法名” ,destroyMethod = “方法名”)
方式二:
通过实现接口InitializingBean(初始化), DisposableBean(销毁)的方式
方式三:
可以使用JSR250
@PostConstruct:在bean创建完成,并且属性赋值完成,来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
方式四:
BeanPostProcessor后置处理器接口:
postProcessBeforeInitialization: 在其他初始化方法之前工作,如init-method,afterPropertiesSet
postProcessAfterInitialization(销毁): 在其他初始化之后工作
