spring IoC (IDEA)—— 使用注解装配Bean

spring容器对于Bean的创建和对象属性的依赖注入提供了注解的支持,让我们在开发中能够更加便捷的实现对象的创建和对象属性的依赖注入。

1.对于Bean的创建spring容器提供了以下四个注解的支持

(1)@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。

(2)@Repository:@Component扩展,被@Repository注解的POJO类表示DAO层实现,从而见到该注解就想到DAO层实现,使用方式和@Component相同;

(3)@Service:@Component扩展,被@Service注解的POJO类表示Service层实现,从而见到该注解就想到Service层实现,使用方式和@Component相同;

(4)@Controller:@Component扩展,被@Controller注解的类表示Web层实现,从而见到该注解就想到Web层实现,使用方式和@Component相同.

以上四个注解在普通使用中是等效的,但在web项目中为了区分三层架构中不同层之间Bean的创建,为了避免注解使用的混乱,使用后三个注解进行区分。

2.对于Bean属性的依赖注入

(1)属性是String类型或者基本数据类型

使用Spring自带的@Value注解。

(2)属性是对象

A.Spring自带的@Autowired注解

B.JSR-250的@Resource注解

C.JSR-330的@Inject注解

3.开启Spring注解支持

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config />
    <context:component-scan base-package="com.etc.entity"/>
</beans>

说明:如果配置了注解扫描包的范围, <context:annotation-config/>可以不用配置,因为配置扫描包的范围后,注解的驱动也就有了。

4.使用注解创建bean

Spring容器对于bean创建的四个注解是等效的,我们只要使用@Component注解来测试就可以了。  

@Component
public class Student {
    //省略…
}

或者

@Component("s1")
public class Student {
    //省略…
}

或者

@Component(value="s2")
public class Student {
    //省略…
}

5.bean属性为String类型及基本数据类型的的依赖注入

@Component
public class Student {
    @Value("2015001002")
    private String no;
    private String name;
    private String gender;
    @Value("16")
    private Integer age = 18;
}

可以将@Value直接放在字段上,此时可以不同提供setter方法,当然,在setter上添加注解也可以:

@Value("16")
public void setAge(Integer age) {
    this.age = age;
}

如果两个同时都有,以set方法上的注解为准!!

6.@Autowired注解

对于bean属性为Java对象的依赖注入,分为两种:一种是byName类型,一种是byType类型的。

增加如下配置: 

   <bean id="teacher1" class="com.etc.entity.Teacher">
        <constructor-arg name="name" value="老师"/>
    </bean>

A.在Student类中的teacher字段中增加@Autowired注解

@Autowired
private Teacher teacher;

测试可以正常使用,说明默认按照类型装配。

B.有多个同类型的配置时,按照名称来装配

<bean id="teacher" class="com.etc.entity.Teacher">
        <constructor-arg name="name" value="老师"/>
</bean>

测试可以正常使用,有多个同类型的对象时,按照名称来装配。

C.对配置进行修改,将id=“teacher”修改为id=”teacher2”

IDE中会提示错误,测试也会报错。

D.配合@Qualifier一起使用

@Autowired
@Qualifier("teacher2")
private Teacher teacher;

E.可选的自动装配

@Autowired(required = false)
private Teacher teacher;

注意:如果没有查找到匹配的类型,不会报错,但是如果有多个匹配的类型,此时也还是会报错。

F.对构造方法进行注解

@Autowired
public Student(Teacher teacher) {
    this.teacher = teacher;
}

7.@Resource注解

简单来说,@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入,@Resource相当于 @Autowired和@Qualifier一起使用。

@Resource
private Teacher teacher;

或者

@Resource(name = "teacher2")
private Teacher teacher;

8.@Inject注解

为了统一各种依赖注入框架的编程模型,JCP发布了Java依赖注入规范,JCP将其称为JSR-330,该规范为Java带来了通用的依赖注入模型。@Inject注解是JSR-330的核心部件,该注解几乎可以完全替换Spring的@Autowired注解。

同@Autowired一样,@Inject可以用来自动装配字段、setter方法和构造方法,但是@Inject注解所标注的依赖关系必须存在,否则会抛出异常。

可以使用@Named注解来限定@Inject所标注的属性,类似于同@Autowired搭配使用的@Qualifer注解。

需要在pom.xml中引入依赖:

<dependency>
  <groupId>org.glassfish.hk2.external</groupId>
  <artifactId>javax.inject</artifactId>
  <version>2.5.0-b62</version>
</dependency>
@Inject
@Named("teacher2")
private Teacher teacher;

结论:从上面可以看到,@Inject同@Autowired相比,还有不足的之处,所以我们还是推荐使用@Autowired。

猜你喜欢

转载自blog.csdn.net/Milan__Kundera/article/details/82526762