注解

来源:互联网 发布:网络出版的类型 编辑:程序博客网 时间:2024/06/14 18:18
</pre><pre class="html" name="code">1. 什么是注解  语法:@注解名称  注解的作用:替代xml配置文件!    servlet3.0中,就可以不再使用web.xml文件,而是所有配置都使用注解!  注解是由框架来读取使用的!2. 注解的使用  * 定义注解类:框架的工作  * 使用注解:我们的工作  * 读取注解(反射):框架的工作3. 定义注解类  class A {}  interface A{}  enum A{}  @interface A{}//天下所有的注解都是Annotation的子类!4. 使用注解  注解的作用目标:    * 类    * 方法    * 构造器    * 参数    * 局部变量    * 包5. 注解的属性  * 定义属性:    > 格式:    @interface MyAnno1 {int age();String name();    }  * 使用注解时给属性赋值    > @MyAnno1(age=100, name="zhangSan")  * 注解属性的默认值:在定义注解时,可以给注解指定默认值!    > int age() default 100;    > 在使用注解时,可以不给带有默认值的属性赋值!  * 名为value的属性的特权    > 当使用注解时,如果只给名为value的属性赋值时,可以省略“value=”,例如: @MyAnno1(value="hello"),可以书写成 @MyAnno1("hello")  * 注解属性的类型    > 8种基本类型    > String    > Enum    > Class    > 注解类型    > 以上类型的一维数组类型    当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号@MyAnno1(a=100,b="hello",c=MyEnum1.A,d=String.class,e=@MyAnno2(aa=200, bb="world"),f=100)public class Demo3 {}@interface MyAnno1 {int a();String b();MyEnum1 c();Class d();MyAnno2 e();int[] f();}6. 注解的作用目标限定以及保存策略限定  6.1 让一个注解,它的作用目标只能在类上,不能在方法上,这就叫作用目标的限定!  * 在定义注解时,给注解添加注解,这个注解是@Target@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})@interface MyAnno1 {}  6.2 保留策略  * 源代码文件(SOURCE):注解只在源代码中存在,当编译时就被忽略了  * 字节码文件(CLASS):注解在源代码中存在,然后编译时会把注解信息放到了class文件,但JVM在加载类时,会忽略注解!  * JVM中(RUNTIME):注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可反射注解!)  限定注解的保留策略  @Retention(RetentionPolicy.RUNTIME)@interface MyAnno1 {}  7. 读取注解(反射)========================模拟注解的使用场景利用注解配置一对多,多对多关系。1.为各个实体写好注解关联关系。Department.java@Entity@Table(name="department")public class Department {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="did")private int did;@Column(name="dname")private String dname;@Column(name="loc")private String loc;@OneToMany(mappedBy="dep",cascade={CascadeType.ALL})private Set<Employee> emps=new HashSet<Employee>();}Employee.java@Entity@Table(name="employee")public class Employee {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="eid")private int eid;@Column(name="ename")private String ename;@Column(name="job")private String job;@ManyToOne-----一对多关联关系@JoinColumn(name="did")private Department dep;-------多对多关联关系@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)@JoinTable(name="rational",joinColumns={@JoinColumn(name="eid",referencedColumnName="eid")},inverseJoinColumns={@JoinColumn(name="proid",referencedColumnName="proid")})private Set<Project> pros=new HashSet<Project>();Project.java@Entity@Table(name="project")public class Project {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="proid")private int proid;@Column(name="proname")private String pname;@Column(name="start_time")private Date strat_time;/* * @ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)@JoinTable(name="rational",joinColumns={@JoinColumn(name="proid",referencedColumnName="proid")},inverseJoinColumns={@JoinColumn(name="eid",referencedColumnName="eid")})*/@ManyToMany(mappedBy="pros")private Set<Employee> emps=new HashSet<Employee>();2.在核心配置文件中加入映射文件。<mapping class="org.ecjtu.entity.Employee"/>    <mapping class="org.ecjtu.entity.Department"/>    <mapping class="org.ecjtu.entity.Project"/>


0 0