如何表明类为配置类,指定扫描加载的组件。
——1.@Configuration:该注解表示声明该类为配置类,使用此注解后,spring会自动将该类加载到容器中。
——2.@ComponentScan:在配制类下使用该注解,该注解能够配制spring扫描的包位置。
该注解还有以下功能:
includeFilters 扫描指定的组件
@Filter(type classes)
excludeFilters 扫描的时候以什么规则排除组件
@Filter(type classes)
useDefaultFilters 为true时默认扫描Component注解组件(controller、service、repository)
如何向spring容器中注入bean的方式
——1.@Bean:(bean的id,默认方法的名字):生成一个bean类对象放入容器中,相当于xml注解的
配合以下两个注解:
1.1@Scope:指定bean类的IOC容器加载规则
prototype:多实例,每次从容器中拿到的类都是new的类。
singleton:单实例,每次从容器中拿到的都是同一个类,容器创建完成后初始化的类。
request:主要针对web应用,递交一次请求创建一次实例。
session:同一个session创建一个实例。
1.2@Lazy:懒加载,主要针对单实例,容器启动的时候不创建对象,第一次使用的时候再创建对象。/默认在容器中启动的时候创建对象。
——2.@Conditional(xxx.class):使用此注解能够根据条件添加bean到容器中。
——3.@Import(value={xxx.class,…}):注册bean,快速给容器中注册一个组件。
value:可以是一个继承了以下接口的类,这些类能够指定引入的bean
ImportSelector接口
public String[] selectImports(AnnotationMetadata importingClassMedata){
return String[]{"全限定类名","全限定类名"};
}
ImportBeanDefinitionRegistrar --条件注册bean
public void registerBeanDefinitions(AnnotationMetadate medata, BeanDefinitionRegistry register){
boolean bean1 = register.containsBeanDefinition("全限定类名");
//判断容器中是否有此bean
if (bean1){
RootBeanDefinition beanDefinition = new RootBeanDefinition(xxx.class);//先用此类封装
//注册一个bean
register.registerBeanDefinition("pig", beanDefinition);
}
}
——4.BeanDefinition向容器中注册Bean,如上代码所示。
——关于注册bean的扩展
通过实现FactoryBean接口的方式也可以加载bean,只需要将实现的此接口的类也添加到容器中即可,spring会自动获取getObject返回的对象。(如果想要需要在FactoryBean本身需要在id前加上&符号,例如:application.getBean("&tets"))
public class tets implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Student();//bean对象实例
}
@Override
public Class<?> getObjectType() {
return Student.class;//bean对象类型
}
@Override
public boolean isSingleton() {
return false;//是否单例
}
}