Spring定义Bean的六种方式
一、xml 配置文件
这种方式在 SpringMVC 中是常用的方式,Spring 启动时会读取配置文件,并将配置文件中配置好的类加入到 IOC 容器中。
使用 ClassPathXmlApplicationContext() 读取配置并启动一个 Spring IOC 容器。调用容器的 getBean() 方法返回需要的对象。
二、配置类
这种方式比较类似于第一种配置文件,但是这种更效率。
创建一个配置类,配合使用 @Bean 注解,以成员方法的形式返回 Bean 实例。
使用 AnnotationConfigApplicationContext() 读取配置类并启动一个 Spring IOC 容器。调用容器的 getBean() 方法返回需要的对象。
三、扫描包
通过 @ComponentSacn 扫描包形式获取 Bean,被扫描的包下的所有带 @Component 注解的类都会被认为是 Bean。
四、BeanDefinition 构建
编程式使用 BeanDefinition 构建 Bean,前三种方式也是基于底层 BeanDefinition 构建出来的。
这种方式更复杂,也更底层。
五、FactoryBean 构建
使用 FactoryBean 构建特殊 Bean,使用 FactoryBean,Spring 会构建两个 Bean,一个是外层类的类型,一个是返回 Bean 的类型,外层类型是通过 Bean 名字前面加 & 符号获取。
创建容器后,外层类型作为 Bean 的类型注册到容器中,在调用 getBean() 方法时,默认返回 getObject() 返回的对象。
如果在 Bean 的名字前面加 & ,则可以获取到外层类型。
FactoryBean 产生单个 Bean,在 IOC 容器的基础上给 Bean 的实现加上了一个简单工厂模式和装饰模式,是一个可以生产对象和装饰对象的工厂 Bean,由 Spring 管理后,生产的对象是由 getObject() 方法决定的。
六、registerBean 直接注册 Bean
在构建 Bean 时使用 Supplier 初始化 Bean 的参数,当然也可以做一些逻辑操作。Supplier 可以简写到 lambda 表达式。