spring boot之注解

前面我们在spring boot中想要用到其它的插件的时候会用一些注解的形式来配置注入,或在spring application.properties中直接注入,或者自己写个配置文件来注入;
今天我们就讲讲这种方式的原理吧,方便我们以后使用。
Spring 从配置文件进化到注解,是方便了好多,但是好多人只是简单的会使用了,压根都不知道它为什么就可以这样了呢;其实注解就是有配置文件演化而来的,我们只需要知道注解对应着配置文件中的哪些标签,就理解了注解到底是干嘛的了;spring框架只不过是从读取配置文件改为扫描注解了,道理其实是一样的。注解的形式为什么是这样的呢@XX;这个解释很好:我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看;

其实一切都得依托于spring框架,约定俗称的一些规定,比如:刚开始扫描到@bean时就会把他的这个方法注册成一个bean;@Autowired就会通过反射将类注入进来;

话不多说,直接开搞,既然spring的本质是bean,我们就先看看@bean,其实就是配置文件中的<bean id=”xxxx” class=”xx.XxClass”/> ,熟悉吧,具体的bean的属性在这儿就不讲了,什么单例模式等等,网上很多,也可参考:http://blog.csdn.net/chenssy/article/details/8222744;还是先说一下什么是spring的核心bean吧

1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;
4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了

其实所有的注解都可以算作@bean,bean是一个抽象的概念,就像是类中的Object,其它的类都可以算是Object;

@bean分为两种:
1是生成注解,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和下面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。
2是使用生成的注解,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

我们先说生成bean,有两种方法:一是直接在类名上添加@bean,二是在类上添加@configure(这个相当于配置文件中的beans环境,@configure则是相当于初始化环境),然后在方法上添加@bean,该方法的返回值则生成bean。
接下来我们就讲讲几个常用的bean注解:
1.@Repository、@Component、@Service 和 @Constroller
这几个注解虽然作用不同,但场合确实一块儿使用,,
为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为 Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring 本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:

  • @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次(就像是@bean没有具体的概念,但是比@bean代表的范围小)。
  • @Service通常作用在业务层,但是目前该功能与 @Component 相同。
  • @Constroller 通常作用在控制层,但是目前该功能与
    @Component 相同。

通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。

2.自定义注解

@Retention:元注解
注解@Retention可以用来修饰注解,是注解的注解,称为元注解。

Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.
Annotation的@interface
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。

1.public @interface MyAnnotation {  
2.    String value() default "hahaha";  
3.}  

等价于

1.public class MyAnnotation extends java.lang.annotation.Annotation{   
2.     private String value = "hahaha";   
3.     public void setValue(String value){   
4.          this.value = value;   
5.     }   
6.     public String getValue(){   
7.          return value;   
8.      }   
9.}  

具体还可参考:
http://blog.csdn.net/foamflower/article/details/5946451
http://blog.csdn.net/yixiaogang109/article/details/7328466

3.@Autowired与@Resource
@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面@Resource 默认按 byName 自动注入罢了,且前者是spring框架带的,而后者是j2EE带的;
1)@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,注解括号内写的是实现类的类型名称,如下:

@Autowired() @Qualifier("baseDao")     
private BaseDao baseDao;   

2)、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")     
private BaseDao baseDao;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值