参考资料:<<Spring源码深度解析>>
一、给容器注册组件的三种方式:
- xml包扫描+@Component/@Controller/@Service/@Repository
- 配置@Bean,可以对第三放jar进行注入
- @Import 方式注入
- 使用Spring提供的FactoryBean(工厂bean)
1.默认获取到的是工厂bean调用 getObject 创建的对象
2.要获取工厂bean本身,需要给 id 前加一个 " & " 标识
二、 注解使用
1、配置文件注解@Configuration/@Bean:
- 创建一个类,用@Configuration,可以将该类注册为配置类,等同于原来的.xml配置文件。
-
在配置类中可以填充实体bean,创建一个返回值为实体bean的方法,并在方法体上用@Bean注解,其中方法名称为bean的默认id。
-
在main()函数中如何调用,使用AnnotationConfigApplicationContext,将配置类传入调用。
2、包扫描注解@ComponentScan以及包扫描规则
- 当添加了@ComponentScan注解后,
@Controller
@Service
@Compnent
@Repository
以上标签均可以在创建的相应类上使用
-
在配置类上添加@ComponentScan注解,并定义需要扫描的包路径,如下图:
-
指定需要扫描或者排除的组件
- FilterType 指定规则
FilterType.ANNOTATION :指定过滤注解的组件
FilterType.ASSIGNABLE_TYPE:按照指定的类型
FilterType.CUSTOM:自定义过滤规则,需要实现 TypeFilter 接口
3、@Scope注解的使用
- Spring默认添加的组件都是单实例的
- 可以使用@Scope()注解,为注入的bean提供作用域的范围:
session:同一次session创建一个实例
request:同一个请求创建一个实例
prototype:多实例,ioc容器启动时候不会调用方法创建创建对象,而是在
每次获取的时候才会调用方法创建对象
singleton:单实例,ioc容器启动的时候就会调用方法创建对象放入ioc容器中,以后每次获取就直接从容器中拿
4、@Lazy懒加载
- 单实例bean,默认容器启动的时候就创建对象,
-
懒加载指的是,容器启动不创建对象,在第一次使用(获取)bean的时候,再去创建对象,并进行初始化
5、 @Conditional 按照条件给容器中注册bean
- 按照一定的条件进行判断,满足条件给容器注册bean
-
获取环境变量:os.name --> 操作系统 的key
-
创建Conditional的实现类
-
在实体bean前添加@Conditional注解,满足条件后,才能进行注入
6、@Import:快速的导入组件,id默认是组件的全类名
-
直接在配置类上添加@Import(xxx.class),id默认是组件的全类名(使用spring4.0.0版本该注解调用有误,切换成4.3.12)
-
实现 ImportSelector 接口,返回需要导入的组件的全类名数组
-
实现 ImportBeanDefinitionRegistrar 接口,手动注册bean到容器中
7、FactoryBean工厂bean注入spring容器中
- 实现 FactoryBean 接口,用户可定制化bean的逻辑
T getObject() 方法,返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
boolean isSingleton():返回由BeanFactory创建的bean的作用域是singleton还是prototype;
Class<T> getObjectType():返回由FactotyBean创建的bean的类型。
-
要获取工厂bean本身,需要给id前加一个 '&' 标识
- BeanFactory 与 FactoryBean的区别
网友评论