首先为大家介绍下spring 元信息的配置一些相关的知识。
配置元信息属于元编程的一部分,通过配置的方式影响容器的行为。关于spring 配置元信息大概可以分为3类
Been 的元信息配置
Ioc 容器配置元信息
外部化属性配置元信息
Been配置元信息
主要是你业务需要感知的,如been的id,name,属性等信息。
Ioc容器配置元信息
这里主要是指对Ioc 容器的一个控制,能够影响容器行为的信息。一般不会不会影响到业务行为,比如说传统的xml配置和注解驱动为什么会有相关的差异,都是需要通过容器配置的方式进行体现的。
外部化属性配置元信息
关于外部化配置,这部分官方文档也没有特别的说明。如在开发中常用的注解@Value ,其实就属于外部化的一个配置元信息。
配置方式
可分为如下几类:
基于xml,properties等配置文件
基于java注解
基于java API
现在对于通过注解方式进行元信息的配置使用加方便,项目文件结构也更加简洁。现在Springboot 项目基本上去就是去配置文件化,但对于一些配置如quartz 定时任务,shiro 安全框架的配置,个人觉得使用传统的xml 文件配置更加方便快捷,了解了spring元信息的基本知识,下面介绍下java 注解装载Spring Been配置元信息。
一、 Spring 模式注解
Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
Sring2.5版本中,引入了更多的Spring类注解,如:@Component 注解是spring 里非常核心的注解,也是一种DDD的概念,称为组件,@Configuration,@Service,@Controller,都可以称之为@Component的派生注解,这里派生要打引号,因为java里面注解是不可以继承的,这里的派生是一种元标注或元注解的方式进行操作。
元标注的方式,在一个注解上标注另一个注解,这样注解@Repostitory 等价@Component
注解@Configuration 同样如此ClassPathScanningCandidateComponentProvider类在扫描Component 相关注解时都会被扫描进来,可以理解为@Component注解的派生。
二 、Spring Bean 依赖注入注解
@Autowired 默认是按照类型装配注入的,如果想按照名称来配注入,则需要结合@Qualifier一起使用,只有当找不到与类型匹配的bean才会按照名称来装备注入。@Resource 注解要求提供一个Bean 名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为 Bean 的名称。@Inject和@Autowired功能差不多,比@Autowired 少一个 required 属性。其中@Autowired 和@Inject 注解是在类AutowiredAnnotationBeanPostProcessor里进行操作的,也包括注解@Value
@Resource 是在CommonAnnotationBeanPostProcessor中进行操作
三 、Spring Bean 条件装配注解 @Profile注解:是spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能。例如使用生产,测试,开发不同的环境使用不同的配置文件。@Conditional:按照一定的条件进行判断,满足条件则给容器中注入bean 从Spring4.0开始 ,@Profile和@Conditional 做了整合, @Profile的实现做了些变化,是基于@Conditional实现的 @Conditional 注解表示所有的条件必须成立,他们之间是and的关系 @Profile 只需实现一个条件,实现接口Condition四、 Spring Bean 生命周期回调注解
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
这两个注解 是在CommonAnnotationBeanPostProcessor 中支持,在构造方法中就默认设置了@PostConstruct 和 @PreDestroy 两个注解。这个是他通过另外一个生命周期操作的。