Spring知识(二)
文章目录
- Spring知识(二)
- 1. @Resource
- 1.2 @Resource是什么?
- 1.3 @Resource中的name属性
- 2. @Value
- 2.1 @Value是什么?
- 2.2 @Value的使用
- 3. FactoryBean
- 3.1 FactoryBean是什么?
- 3.2 FactoryBean接口中的方法
- 3.3 FactoryBean的特殊点
- 4. ApplicationContext
- 4.1 ApplicationContext是什么?
- 4.2 ApplicationContext所继承的接口
- 4.2.1 EnvironmentCapable
- 4.2.2 ListableBeanFactory
- 4.2.3 HierarchicalBeanFactory
- 4.2.4 MessageSource
- 4.2.5 ApplicationEventPublisher
- 4.2.6 ResourcePatternResolver
- 5.BeanPostProcessor
- 5.1 BeanPostProcessor是什么?
- 5.2 BeanPostProcessor中的方法
- 5.3 InstantiationAwareBeanPostProcessor
- 6.AOP
- 6.1 AOP是什么?
- 6.2 AOP中的核心概念
- 6.3 AOP的工作原理
1. @Resource
1.2 @Resource是什么?
@Resource注解与@Autowired类似,也是用来进行依赖注入的;
@Resource是java层面
所提供的注解;
@Autowired是Spring层面
所提供的注解;
它们依赖注入的底层实现逻辑也不同
。
1.3 @Resource中的name属性
@Resource注解中有一个name属性,针对name属性是否有值,@Resource的依赖注入底层流程是不同的。
@Resource如果name属性有值,那么Spring会直接根据所指定的name值取Spring容器中找Bean对象,如果找到了则成功,如果没有找到,则报错。
- 1、先判断属性名字在Spring容器中是否存在Bean对象;
- 2、如果存在,则成功找到Bean对象进行注入;
- 3、如果不存在,则根据属性类型取Spring容器找Bean对象,找到一个则进行注入。
2. @Value
2.1 @Value是什么?
@Value注解和@Resource、@Autowired类似,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中来取值的,并且@Value可以解析SpEL(Spring表达式)。
2.2 @Value的使用
@Value(“myzi”)
直接将字符串"muzi"赋值给属性,如果属性类型不是String,或无法进行类型转化,则报错。
@Value("${muzi}")
将会把{muzi}"当作普通字符串注入给属性。
@Value("#{muzi}")
会将#{}中的字符串当作Spring表达式进行解析,Spring会把"muzi"当作beanName,并从Spring容器中找对应bean,如果找到则进行属性注入,没找到则报错。
3. FactoryBean
3.1 FactoryBean是什么?
FactoryBean是Spring所提供的一种较灵活
的创建Bean的方式,可以通过实现FactoryBean接口
中的getObject()
方法来返回一个对象,这个对象就是最终的Bean对象。
3.2 FactoryBean接口中的方法
-
Object getObject()
:返回的是Bean对象; -
boolean isSingleton()
:返回的是否是单例Bean对象; -
Class getObjectType()
:返回的是Bean对象的类型。
3.3 FactoryBean的特殊点
@Component("muzi")
public class MuziFactoryBean implements FactoryBean {
@Override
//Bean对象
publci Object getObject() throws Exception {
return new User();
}
@Override
//Bean对象的类型
public Class<?> getObjectType() {
return User.class;
}
@Override
//所定义的Bean是单例还是原型
public boolean isSingleton() {
return true;
}
}
上述代码,实际上对应了两个Bean对象:
- 1、beanName为"muzi",bean对象为getObject方法所返回的User对象。
- 2、beanName为"&muzi",bean对象为MuziFactoryBean类的实例对象。
FactoryBean对象本身也是一个Bean,同时它相当于一个小型工厂,可以生产出额外的Bean。
BeanFactory是一个Spring容器,是一个大型工厂,它可以生产出各种各样的其它Bean。
FactoryBean机制被广泛的应用在Spring内部和Spring与第三方框架或组件的整合过程中。
4. ApplicationContext
4.1 ApplicationContext是什么?
ApplicationContext是比BeanFactory更加强大的Spring容器,它既可以创建bean、获取bean,还支持国际化、事件广播、获取资源等BeanFactory不具备的功能。
4.2 ApplicationContext所继承的接口
- EnvironmentCapable
- ListableBeanFactory
- HierarchicalBeanFactory
- MessageSource
- ApplicationEventPublisher
- ResourcePatternResolver
4.2.1 EnvironmentCapable
ApplicationContext继承了这个接口,表示拥有了获取环境变量
的功能,可以通过ApplicationContext获取操作系统
环境变量和JVM
环境变量。
4.2.2 ListableBeanFactory
ApplicationContext继承了这个接口,就拥有了获取所有beanNames
、判断某个beanName是否存在beanDefinition对象
、统计BeanDefinition个数
、获取某个类型对应的beanNames
等功能。
4.2.3 HierarchicalBeanFactory
ApplicationContext继承了这个接口,就拥有了获取父BeanFactory
、判断某个name是否存在bean对象
的功能。
4.2.4 MessageSource
ApplicationContext继承了这个接口,就拥有了国际化
功能,比如可以直接利用MessageSource对象获取某个国际化资源(比如不同国家语言对应的字符)。
4.2.5 ApplicationEventPublisher
ApplicationContext继承了这个接口,就拥有了事件发布
功能,可以发布事件,这是ApplicationContext相对于BeanFactory比较突出、常用的功能。
4.2.6 ResourcePatternResolver
ApplicationContext继承了这个接口,就拥有了加载并获取资源
的功能,这里的资源可以是文件、图片等某个URL资源都可以。
5.BeanPostProcessor
5.1 BeanPostProcessor是什么?
BeanPostProcessor是Spring所提供的一种扩展机制
,可以利用该机制对Bean进行定制化加工
,在Spring底层源码实现中,也广泛的用到了该机制,BeanPostProcessor通常也叫做Bean后置处理器
。
BeanPostProcessor在Spring中是一个接口
,我们定义一个后置处理器,就是提供一个类实现该接口,在Spring中还存在一些接口继承了BeanPostProcessor,这些子接口是在BeanPostProcessor的基础上增加了一些其它的功能。
5.2 BeanPostProcessor中的方法
postProcessBeforeInitialization()
:初始化前方法,表示可以利用这个方法来对Bean在初始化前进行自定义加工。
postProcessAfterInitialization()
:初始化后方法,表示可以利用这个方法来对Bean在初始化后进行自定义加工。
5.3 InstantiationAwareBeanPostProcessor
BeanPostProcessor的一个子接口
,
postProcessorBeforeInstantiation()
:实例化前;
postProcessorAfterInstantiation()
:实例化后;
postProcessProperties()
:属性注入后。
6.AOP
6.1 AOP是什么?
AOP就是面向切面编程
,是一种非常适合在无需修改业务代码
的前提下,对某个或某些业务增加统一的功能
。比如日志记录、权限控制、事务管理等,能很好的使得代码解耦,提高开发效率。
6.2 AOP中的核心概念
Advice
:Advice可以理解为通知、建议,在Spring中通过定义Advice来定义代理逻辑;Pointcut
:Pingtcut是切点,表示Advice对应的代理逻辑应用在哪个类、哪个方法上;Advisor
:Adviser等于Advice+Pointcut,表示代理逻辑和切点的一个整体,程序员可以通过定义或封装一个Advisor,来定义切点和代理逻辑;Weaving
:Weaving表示织入,将Advice代理逻辑在源代码级别嵌入到切点得过程,就叫做织入;Target
:Target表示目标对象,也就是被代理对象,在AOP生成的代理对象中会有目标对象;Join Point
:Join Point表示连接点,在Spring AOP中,就是方法的执行点。
6.3 AOP的工作原理
- 1、Spring生成bean对象时,先实例化出来一个对象,也就是target对象;
- 2、再对target对象进行属性填充;
- 3、在初始化后步骤中,会判断target对象有没有对应的切面;
- 4、如果有切面,就表示当前target对象需要进行AOP;
- 5、通过Cglib或JDK动态代理机制生成一个代理对象,作为最终的bean对象;
- 6、代理对象中有一个target属性指向了target对象。