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}")

将会把spring 项目 resources目录_字符串{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对象。