IOC 与DI 系列:2.注解的原理和在IOC中的使用

1.注解的概念和自定义注解

注解和注释两个概念名字相似,但是内容却完全不同:
注解: 说明程序的,给计算机看的
注释: 用文字描述程序,给程序员看的
定义:
注解(Annotation),也叫元数据,一种代码级别的说明。它与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

使用注解目的:简化 xml 配置。
作用分类:

1.编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
2.代码分析:通过代码里标识的注解对代码进行分析【使用反射】
3.编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查

1.1.JDK预定义的注解
@Override:检查被该注解标注的方式是否是继承自父类【接口】
@Deprecated: 该注解表示注释的内容过时
@SuppressWarnings: 压制警告
压制的警告主要有这么多:

all to suppress all warnings (抑制所有警告)
boxing to suppress warnings relative to boxing/unboxing operations(抑制装箱、拆箱操作时候的警告)
cast to suppress warnings relative to cast operations (抑制映射相关的警告)
dep-ann to suppress warnings relative to deprecated annotation(抑制启用注释的警告)
deprecation to suppress warnings relative to deprecation(抑制过期方法警告)
fallthrough to suppress warnings relative to missing breaks in switch statements(抑制确在switch中缺失breaks的警告)
finally to suppress warnings relative to finally block that don’t return (抑制finally模块没有返回的警告)
hiding to suppress warnings relative to locals that hide variable()
incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)(忽略没有完整的switch语句)
nls to suppress warnings relative to non-nls string literals(忽略非nls格式的字符)
null to suppress warnings relative to null analysis(忽略对null的操作)
rawtypes to suppress warnings relative to un-specific types when using generics on class params(使用generics时忽略没有指定相应的类型)
restriction to suppress warnings relative to usage of discouraged or forbidden references
serial to suppress warnings relative to missing serialVersionUID field for a serializable class(忽略在serializable类中没有声明serialVersionUID变量)
static-access to suppress warnings relative to incorrect static access(抑制不正确的静态访问方式警告)
synthetic-access to suppress warnings relative to unoptimized access from inner classes(抑制子类没有按最优方法访问内部类的警告)
unchecked to suppress warnings relative to unchecked operations(抑制没有进行类型检查操作的警告)
unqualified-field-access to suppress warnings relative to field access unqualified (抑制没有权限访问的域的警告)
unused to suppress warnings relative to unused code  (抑制没被使用过的代码的警告)

1.2.自定义注解

“@注解” 的本质是lang下面的一个接口Annotation
格式

// 元注解
public @interface 注解名称{
    // 属性列表
}

将自定义的注解反编译后的内容:

public interface MyAnno extends java.lang.annotation.Annotation {

}

注解的本质其实就是一个接口,继承Annotation父接口:

 /**
 * 注解的本质就是接口
 */
public @interface MyAnno {
    public String show();
}

属性:在接口中定义的抽象方法

返回结果必须是如下类型
1.基本数据类型
2.String类型
3.枚举类型
4.注解
5.以上类型的数组

属性赋值注意点:

1.如果定义的属性时,使用default关键字给属性默认初始值,可以在使用注解时不赋值
2.如果只有一个属性需要赋值,而且该属性的名称是value,那么在赋值时 value可以省略
3.数组赋值的时候,值使用{}包裹,如果数组中只有一个值,那么{}可以省略

1.3.元注解

DK中给我们提供的4个元注解
1.@Target:描述当前注解能够作用的位置

​ ElementType.TYPE:可以作用在类上
​ ElementType.METHOD:可以作用在方法上
​ ElementType.FIELD:可以作用在成员变量上

2.@Retention: 描述注解被保留到的阶段

​ SOURCE < CLASS < RUNTIME
​ SOURCE:表示当前注解只在代码阶段有效
​ CLASS:表示该注解会被保留到字节码阶段
​ RUNTIME:表示该注解会被保留到运行阶段 JVM
​ 自定义的注解:RetentionPolicy.RUNTIME

3.@Documented:描述注解是否被抽取到JavaDoc api中
4.@inherited:描述注解是否可以被子类继承
例如经常看到这种类型的注解定义:

 @Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {
}

2. Spring 的注解

Spring 中的注解比较多,针对 Bean 管理中创建对象提供的注解有:
(1) @Component,普通的组件
(2) @Service,主要用在业务逻辑层
(3) @Controller,web层
(4) @Repository,主要用在dao层
上面四个注解功能是一样的,都可以用来创建 bean 实例。

格式: @注解名称(属性名称=属性值, 属性名称=属性值…)

2.1 使用步骤

1.引入依赖
将spring-aop-5.2.6.RELEASE.jar文件导入到工程中
2.开启组件扫描
如果扫描多个包,多个包之间使用逗号隔开。

<context:component-scan base-package="com.atguigu"></context:component-scan>

3.创建类,在类上面添加创建对象注解

//相当于 <bean id="userService" class=".."/>
//在注解里面 value 属性值可以省略不写默认值是类名称,首字母小写
@Component(value = "userService") 
    public class UserService {
       public void add() {
        System.out.println("service add.......");
     }
}

调用方法:

@Test
public void annotationTest(){
    ApplicationContext context =
            new ClassPathXmlApplicationContext("bean3.xml");
    UserService userService=context.getBean("userService",UserService.class);
    userService.add();
}

3. 基于注解方式实现属性注入

  1. @Autowired:根据属性类型进行自动装配
    第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
    第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解。
@Component(value = "userService")
public class UserService {
    @Autowired
    private UserDao userDao;
    public void add() {
        userDao.add();
        System.out.println("service add.......");
    }
}
  1. @Qualifier:根据名称进行注入
    这个@Qualifier 和上面@Autowired 一起使用。
    这就需要被注入的类也加注解,并且标注名称
@Service("userDao1")
public class UserDao {
    public void add(){
        System.out.println(" dao add ..... ");
    }
}

调用方法:

@Component(value = "userService")
public class UserService {
    @Autowired
    @Qualifier(value = "userDao1") //根据名称进行注入
    private UserDao userDao;
    public void add() {
        userDao.add();
        System.out.println("service add.......");
    }
}

4.完全注解开发

目前Spring已经支持不使用xml的全注解开发方式。我们自己操作一下:
新建一个Config类:

@Configuration //作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.lqc"})
public class SpringConfig {
}

然后调用的时候这么写:

@Test
public void annotationTest3(){
    //加载配置类
    ApplicationContext context
            = new AnnotationConfigApplicationContext(SpringConfig.class);
    UserService userService = context.getBean("userService",
            UserService.class);
    System.out.println(userService);
    userService.add();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵横千里,捭阖四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值