@Resource是如何工作的
- @Resource和@Autowired注解类似, 用于依赖注入, @Resource是Java层面提供的, 而@Autowired是Spring提供的, 它们的底层实现逻辑也有不同
- @Resource有一个name属性, 当该属性不为空时, Spring会直接根据所指定的name去容器中寻找对应的bean对象, 如果没找到则抛异常
- 如果name为空, 那么@Resource会先根据要注入的属性名去容器中查找对象, 如果存在则进行注入, 如果不存在则根据属性类型在容器中进行查找, 找到一个则进行注入
@Value是如何工作的
- @Value也是用于进行依赖注入的, 只不过@Value是用于从Properties等文件中获取属性值的, 并且@Value可以解析Spel
- @Value(“xxx”) 这种形式会将xxx直接赋值到属性里, 如果类型无法转换则会报错
- @Value("${xxx}") 这种形式会从文件中找到对应的属性进行赋值, 如果文件中不存在对应的属性那么会将该值解析为字符串进行赋值
- @Valule("#{xxx}") 这种形式会解析成Spring表达式, 从容器中寻找name为xxx的bean对象, 如果找到了则进行注入, 没找到则抛异常
FactoryBean是什么
- FactoryBean是Spring提供的灵活创建Bean的方式, 可以实现FactoryBean接口重写getObject()方法来创建bean对象
- FactoryBean接口有三个方法:
- getObject() 方法用于创建bean对象
- isSingleton() 方法用于表示该对象是否是单例
- getObjectType() 方法用于表示bean对象类型
- 下图中, 实际创建了两个bean对象, 一个是类型为User, name为zhouyu的bean对象, 一个是name为&zhouyu的FactoryBean对象
- 注意分清FactoryBean 和 BeanFactory,
- FactoryBean 是一个小型工厂, 它自己也是bean对象, 同时可以创建bean对象
- BeanFactory是容器, 可以生产出各种各样的bean对象