1、Java基础加强:
注解:
动态代理
类加载器
2、 注解:
作用:主要就是用来替代xml的配置文件,因为解析xml比较繁琐
存在的位置:在对应的Java类中.
使用的范围:用于修饰包,类,构造器,方法,成员变量,参数和局部变量的声明.
存储形式:key\value形式
不影响原本的代码执行
注解与XML的区别:
注解:
优点:
直观,简单.
配置方式容易.
缺点:
配置信息相对过于零散.
修改过于麻烦(重新编译)
XML:
优点:
与Java类逻辑的关系低耦合.
复用性好
修改很简单(不用编译)
缺点:
编写过于复杂.
解析操作过于复杂.
总结:两种混合使用比较好,注解在配置基本不会改使用,xml配置一些经常改动的配置。
3、Java中提供三个基本注解:
a.@Override:限定重写父类方法
用处:当一个类继承于另一个类,并重写其提供的方法时.
例如:
接口
public interface Person {
public void eat();
}
ManPerson类实现接口
public class ManPerson implements Person {
@Override
public void eat() {
}
}
在实现的接口方法和继承类重写类的方法时,默认自动加了@Override,表示这个是父类的方法
加了这个注解就不能修改方法的名字了。
b.@Deprecated:标示已过时
作用:保证软件或系统版本更新,对版本的兼容性(新版本只能增加内容,不能修改及删除).
调用的时候会出现方法上有个横线。
c.@SuppressWarnings:抑制编译器警告
有时候编译器会提示一些黄色的警告错误,加上了就可以去掉黄色警告
例如:
@SuppressWarnings("rawtypes")
ArrayList list = new ArrayList<>();
4、自定义注解:
@interface这个不是接口,步骤:
a.在包名上右击--New --- Other... --- 输入 anno,会自动出现 Annotation
public @interface MyAnno {
}
b.我们就可以在方法上加上自己的注解了
@MyAnno
public void testMyAnno(){
}
这样我们就完成了自己的注解。我们可以在注解里面加属性,例如:
public @interface MyAnno {
//属性
int num();
}
@MyAnno(num = 0)
public void testMyAnno(){//你定义了num属性,必须给值
}
注意:
如果自定义注解,只定义value属性(没有任何其他属性)
public @interface MyAnno {
//属性
String value();
}
使用该注解时,可以省略"value="(可以直接指定属性值,而不定义属性名)
@MyAnno("")
public void testMyAnno(){//你定义了num属性,必须给值
}
现在我们还不知道为什么要定义注解,有啥用呢?往下看。
5、设定自定义注解的修饰范围:
@Target注解:用于修饰自定义注解
指定该自定义注解允许修饰Java类的哪个部分(类、成员变量、方法等)
例如:我只想要@MyAnno("")只能修饰类
自定义注解
package com.example.zhujie;
@Target(ElementType.TYPE )//可使用的类型可以查看源码
public @interface MyAnno {
//属性
int num();
}
使用:
package com.example.zhujie;
@MyAnno(num = 0)
public class ManPerson implements Person {
@SuppressWarnings("rawtypes")
ArrayList list = new ArrayList<>();
//@MyAnno(num = 0) 不能修饰方法了,只能修饰类
public void testMyAnno(){
}
}
@Retention注解: 用于修饰自定义注解
指定该自定义注解的生命周期.(生命周期 - SOURCE、CLASS、RUNTIME)
SOURCE:在源码中有用
CLASS:在编译为class还在
RUNTIME:一直在运行中,注解都在
例如:
@Target(ElementType.TYPE )
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnno {
//属性
int num();
}
6、通过反射读取注解:
只能读取运行时的注解;
例如:
//@Target(ElementType.TYPE )
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
//属性
String name();
}
public class TestAnnotation {
public static void main(String[] args) throws Exception {
Test t = new Test();
MyAnno anno = t.getClass().getAnnotation(MyAnno.class);//获取类的注解
System.out.println(anno.name());
Method m = t.getClass().getMethod("test");
MyAnno anno1 = m.getAnnotation(MyAnno.class);//获取方法的注解
System.out.println(anno1.name());
}
}
@MyAnno(name = "类的注解")
class Test{
@MyAnno(name = "方法的注解")
public void test(){
System.out.println("test");
}
}
打印的信息:
类的注解
方法的注解
7、注解的运用:
我们可以在JDBC中使用注解配置,注解类就不写了,比较简单。
@JDBCAnno(driverClassName = "com.mysql.driver", password = "root", url = "jdbc:mysql://localhost:3306/mydb", username = "root")
public class JDBCUtils {
public static Connection getConnection(){
Connection conn = null;
//1 读取四大参数
Class clazz = JDBCUtils.class;
JDBCAnno jdbcAnno = (JDBCAnno) clazz.getAnnotation(JDBCAnno.class);
//2 注册驱动类
try {
Class.forName(jdbcAnno.driverClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//3 DriverManager获取连接
try {
conn = DriverManager.getConnection(jdbcAnno.url(), jdbcAnno.username(), jdbcAnno.password());
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}