菜鸟的成长之路——spring的注解使用

  我们前面用了很多节课来说注入依赖的事情,注入依赖无非就是两个要素——谁是bean、谁注入了这个bean。
  对于前者,我们采用bean标签进行配置,对于后者,我们有三种注入方式。今天我们从这两个角度来分析spring框架中另个让人眼前一亮的优势:注解。

1、注解和xml配置相比有哪些优缺点?

优点:
  xml比较冗长,很多时候xml需要好几行才能解决的问题一个注解就可以解决掉。
  因为注解比较简洁,使用起来比较方便,在开发效率问题上,对程序员有很大帮助。
  注解是相对安全的,在运行期之前就可以看到存在的问题,而xml只能在运行期才能发现。

缺点:
  注解是分散到各个类中的,在管理和维护的时候比较难受。
  spring提倡的是非侵入式,也就是让代码有更好的耦合度,但是注解显然失去了这个优点。
  更难扩展和维护,xml在依赖关系更容易进行管理。

  注解也好,xml也罢,都是为了让程序员更简单的去处理问题。因此在开发中,不必要拘泥到底使用注解还是xml配置,哪种方式让我们开发的时候更得心应手,哪种方式就是对于你来说最好的选择。

2、spring怎么使用注解来指定bean?

  spring中指定bean的注解有四个,都是类级别的注解,分别是@Component、@Controller、@Service、@Repository。四个注解都可以将类指定成bean,bean的名称也就是id属性默认是首字母小写的类名。如果需要指定bean的名称,可以在注解后面写上小括号并传参数,例如:@Component(“beanName”)。
  四个注解也有一定的区别,区别如下:

  • @Controller注解,指定控制层的bean。
  • @Service注解,指定业务层的bean。
  • @Reponsitory注解,指定数据层的bean。
  • @Component注解,指定难以分到某一层的bean。

  四个注解在意义上有些区别,但是在效果和使用上,都是一样的,我们使用@Component注解来举个例子:

People.java

package com.spring.pojo;

import org.springframework.stereotype.Component;

@Component
public class People {
    private Pet p;
    public void setPet(Pet p) {
        this.p = p;
    }
    public Pet getPet() {
        return p;
    }
}

Pet.java

package com.spring.pojo;

import org.springframework.stereotype.Component;

@Component
public class Pet {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

  这样我们就拥有了两个bean,一个是id为people的,一个是id为pet的。

3、spring怎么使用注解来注入bean?

  注解注入bean有两种方案,要么使用@Autowired和@Qualifier注解配合,要么使用@Resource注解。
  我们先来看一下@Autowired和@Qualifier注解配合使用:
People.java

package com.spring.pojo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class People {
    @Autowired
//  如果不写@Qualifier注解,将进行自动装配
    @Qualifier("pet")
    private Pet p;
    public void setPet(Pet p) {
        this.p = p;
    }
    public Pet getPet() {
        return p;
    }
}

Pet.java

package com.spring.pojo;

import org.springframework.stereotype.Component;

@Component
public class Pet {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

  这样可以将Pet的bean装配到People的bean上,再来看一下@Resource注解:
People.java

package com.spring.pojo;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component
public class People {
    @Resource(name="pet")
    private Pet p;
    public void setPet(Pet p) {
        this.p = p;
    }
    public Pet getPet() {
        return p;
    }
}

Pet.java

package com.spring.pojo;

import org.springframework.stereotype.Component;

@Component
public class Pet {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

  这两组注解都可以做到装配bean。

4、@Autowired里面参数有哪些?

  @Autowired注解是自动装配bean的,它会自动匹配名称相同或者类型相同的bean。
  @Autowired注解有一个参数required,参数值默认为true,也就是如果找不到相匹配的bean会抛出异常,如果注解写成@Autowired(required=false)的形式,如果找不到匹配的bean,则不会抛出异常。

4、@Qualifier注解具体怎么使用?

  @Qualifier注解不能单独使用,他通常是配合@Autowired注解使用。换句话说,有@Autowired没有@Qualifier可以,但是有@Qualifier没有@Autowired不可以。
  @Qualifier注解的参数是通过id筛选bean的。

5、@Resource注解具体怎么使用?

  @Resouece注解可以指定装配某个bean。
  @Resouece注解有name和type两个参数,如果两个参数都有值,则匹配名称和类型全部相同的bean,匹配失败抛出异常。
  @Resouece注解只有name属性有值,则按照名称进行匹配。如果只是type有值,则按照类型进行匹配。

5、使用注解是不是就可以不用去写ApplicationContext.xml了?

  并不是,我们在ApplicationContext.xml中需要配置如下代码:

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

  这行代码指出我们需要扫描哪些包,base-package属性后面的值就是制定的包路径,多个路径用逗号隔开。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值