注解的理解和元注解

注解:
在Spring配置文件中:
default-autowire="byType";
注解的方式:如果default-autowire=“byType”通过类型进行注解,如果default-autowire=“byName”通过类名进行注解
还有注解:Autowired和Resource进行注解
在spring中的配置了自动扫描的注解:
<context:component-scan base-package="自动扫描的包">
</context:conponent-scan>
<context:annotation-config></context:annotation-config>
两者的差异:
1》component-scan包含了annotation-config,annotation-config含有的属性有include-filter,exclude-filter在java代码中进行分层的使用的
@Controller(控制层),@Service(服务层),@Respository有具体分层的时候使用(这些注解属于annotation-config)
2》component-scan含有自己的属性是user-default-filter,默认状态是user-default-filter="true";
component-scan中包含了annotation-config所有属性。可以不在Sring中进行bean的填写。
annotation-config需要bean的书写。
3》具体分析一下@Autowire,@Resource的之间的关系
在使用default-autowire=“byName”在spring容器中在加载bean的时候,
@在没有自动的装配的时候:
public class Service{
private Source source;
public void setSource(Source source){
this.source=source;
}
}
@设置自动装配,在xml中并没有给Service的bean配置属性source,但是在beans中配置了autowire=“byName”    这样配置文件
就会public class Service中的setSource找bean id=“Source”的bean,然后自动配置上去,如果没有找到就不配置。
注意:byName的name是java 中setXXX的XXX和上面设置的Source没有关系
@设置自动装配,在xml中也没有给Service的bean配置属性source,但是在bean中配置了autowire=“byType”这样配置的文件
就会public class Service中的setSource(Source source)中的参数类型Source就是byType中的Type
我们现在项目中因为配置自懂扫描,
<context:component-filter base-package="自动扫描的包"></context:componentfitler>
使用这个自动扫描可以不用再配置文件中添加bean的标签,
如果使用<context:annotation-config>需要添加bean的标签,没有bean的标签就没有效果。
============================自定义的注解
自定义注解:
元注解:元注解的作用就是负责注解其他注解,java5.0定义了4个标准的meta-annotation类型
@Target
@Retention
@Documented
@Inherited
举例:
@Retention(RUNTIME)
@Target(TYPE)
@Documented
public @interface Table {
    String value();
}
@Target作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)。
取值(ElementType)有:
1:CONSTRUCTOR:用于描述构造器
2:FILED:用于描述域
3:LOCAL_VARIABLE:用于描述局部变量
4:METHOD:用于描述方法
5:PACKAGE:用于描述包
6:PARAMETER:用描述参数
7:TYPE:用于描述类,接口(包括注解类型)或enum声明。
@Retention
作用:表示需要在什么级别保存该注释信息,用于描述注解的声明周期(即:被描述的注解在什么范围之内);
取值(RetentionPoicy)有:
1:SOURCE:在源文件中有效(即源文件的保留);
2:ClASS:在class文件中有效(即class保留);
3:RUNTIME:在运行时有效(即运行时保留);
Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型
Column注解的RetentionPolicy的属性值是RUNTIME,注解处理器可以通过反射,获取该注解的属性值,从而做一些运行时的逻辑处理。
@Documented
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员
@Inherited
@Inherited元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的,如果有个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation
将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。
如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,
直到发现指定的annotation类型被发现,或者到达类继承结构的顶层
自定义注解:
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,有编译程序自动完成其他细节,在定义注解时,不能继承其他的注解或接口,@interface
用来声明一个注解,其中每一个方法都声明了一个配置参数,方法名就是参数的名称,返回值类型就是参数的类型(返回的类型只能时基本类型,Class,String。enum).
可以通过default来声明参数的默认值。
定义注解格式:
pulic @interface 注解名{定义体}
注解参数可支持的数据类型:
1:所有的基本数据类型(int,float,boolean,byte,double,char,long,short);
2:Stirng类型
3:Class类型
4:enumn类型
5:Annotation类型
6:以上素有类型的数组
Annotation类型里面的参数该怎么设定
第一,只能用public或者默认(defalut)这俩个访问权限修饰。例如:String value();这里方法设置为默认的类型default
第二,参数成员只能用于基本的类型byte,short,chart,int,long,float,double,boolean八种基本类型,和还有他们的数组。
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
注解元素的默认值:

  注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。
因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,
所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,
在定义注解时,这已经成为一个习惯用法
如果需要举例可以通过这个链接
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
注解处理器链接:
http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值