注解(Annotation)是一种用于为程序代码添加元数据的特殊语法结构。它可以在不改变原有逻辑的情况下,为程序中的类、方法、字段等元素附加额外的信息和标记。
元注解的作用就是负责注解其他注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
元注解有六个:
@Target(表示该注解可以用于什么地方)
ElementType.TYPE:可以作用在类上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成员变量上
@Retention(表示再什么级别保存该注解信息)
SOURCE < CLASS < RUNTIME
SOURCE:表示当前注解只在代码阶段有效
CLASS:表示该注解会被保留到字节码阶段
RUNTIME:表示该注解会被保留到运行阶段 JVM
自定义的注解:RetentionPolicy.RUNTIME
@Documented(将此注解包含再javadoc中)
@Inherited(允许子类继承父类中的注解)
@Repeatable(1.8新增,允许一个注解在一个元素上使用多次)
@Native(1.8新增,修饰成员变量,表示这个变量可以被本地代码引用,常常被代码生成工具使用)
1.定义一个注解
@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE}) //可以在字段、枚举的常量、方法
@Retention(RetentionPolicy.RUNTIME)
public @interface Init {
String value() default "";
}
2.使用注解
public class User {
private String name;
private String age;
public String getName() {
return name;
}
@Init("louis")
public User setName(String name) {
this.name = name;
return this;
}
public String getAge() {
return age;
}
@Init("22")
public User setAge(String age) {
this.age = age;
return this;
}
}
3.注解解析器
public class userFactory {
public static User create() {
User user = new User();
// 获取User类中所有的方法(getDeclaredMethods也行)
Method[] methods = User.class.getMethods();
try
{
for (Method method : methods)
{
// 如果一个注解指定注解类型是存在于此元素上此方法返回true,否则返回false
//参数 -- 对应于注解类型的Class对象
if (method.isAnnotationPresent(Init.class))
{
//此方法返回该元素的注解在此元素的指定注释类型(如果存在),否则返回null
Init init = method.getAnnotation(Init.class);
// 如果Method代表了一个方法 那么调用它的invoke就相当于执行了它代表的这个方法,在这里就是给set方法赋值
method.invoke(user, init.value());
}
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
return user;
}
}
4.使用
public static void main(String[] args) {
User user = userFactory.create();
user.setAge("30");
System.out.println(user.getName());
System.out.println(user.getAge());
}
@Override 表示当前方法覆盖了父类的方法
@Deprecated 表示方法已经过时,方法上有横线,使用时会有警告。
@SuppressWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)
@SafeVarargs (jdk1.7更新) 表示:专门为抑制“堆污染”警告提供的。
@FunctionalInterface (jdk1.8更新) 表示:用来指定某个接口必须是函数式接口,否则就会编译出错。
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件
@Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载