Spring中组件注册的方式归纳
1.1 @Configuration配置类(配置文件)
@Configuration //告诉spring这是一个配置类
public class MainConfig {
}
@Configtion告诉Spring这是一个配置类===>就相当于一个xml配置文件
所有spring在xml中的配置都可以在标有@Configuration这个配置类中配置
1.2@Bean注册组件
1.2.1@Bean简单注册组件
@Configuration //告诉spring这是一个配置类
public class MainConfig {
//给容器中注册一个bean;
//类型为返回值的类型;
//id为默认方法名;
//id可以通过@Bean里面的取值修改。
@Bean("person")
public Person person(){
return new Person("lisi",20);
}
}
1.2.2@Scope设置组件作用域
在Spring中,组件拥有一定的作用域,我们可以通过@Scope设置bean的作用域。
在下面的配置类中我们可以通过 @Scope 注解给组件设置作用域:
@Configuration
public class MainConfig{
@Scope("prototype")
@Bean("person")
public Person person(){
return new Person("张三",25);
}
}
在Spring容器中注册的bean如果没有设置@Scope默认都是单实例的;
@Scope 中的几个取值:
- prototype: 多实例的,IOC容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象,每次获取都会调用方法创建一次。
- singleton: 单实例的(默认值),IOC容器启动会调用方法创建对象放到IOC容器中,以后每次获取就直接从容器中拿。
- request: 同一个请求创建一个实例。
- session: 同一个session创建一个实例。
单实例下的懒加载 @Lazy
上面我们说到 @Scope 在 singleton 取值下bean为单实例,单实例bean会在IOC容器启动的时候默认创建对象,如果我们暂时用不上这个对象,那么容器一启动就创建对象将会占用一定的资源,这时我们可以使用懒加载来避免一创建容器就加载暂时不用的组件,当我们在第一次使用的时候才去创建该对象。
@Configuration
public class MainConfig{
/**
* 懒加载 :
* 单实例bean:默认在容器启动的时候创建对象;
* 懒加载:容器启动的时候先不创建对象。第一次获取bean的时候才加载
* @Lazy
*/
@Lazy
@Scope("singleton")
@Bean("person")
public Person person(){
return new Person("张三",25);
}
}
1.2.3@Conditional按照条件注册组件
配置了@Bean注解的组件,在默认情况下是任何条件都会被注册,在现实开发中不同的环境我们可能需要的组件不同,如果把全部条件下的组件都注册又太消耗资源,这时Spring 提供了 @Condational注解,可以根据在不同条件下注册我们所需要的组件。
我们点进 @Condational 注解源码看一下:
//@Condational源码
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition} classes that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
源码中可以看出使用@Conditional需要传入一