bean 的定义基于注解的配置

自动扫描组件的注释类型
有 4 种注释类型,分别是:

  • @Component ——表示一个自动扫描 component
  • @Repository ——表示持久化层的 DAO component
  • @Service ——表示业务逻辑层的 Service component
  • @Controller ——表示表示层的 Controller component

在项目中,我们可以将所有自动扫描组件都用 @Component 注释,Spring 将会扫描所有用 @Component 注释过得组件。 实际上,@Repository@Service@Controller 三种注释是为了加强代码的阅读性而创造的

  • @Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

通过 @Autowired的使用来消除 set ,get方法。通过这个步骤,我们可以直接把bean的属性注入到这个变量里面了。

package com.anthony1314.spring.dao;

import org.springframework.stereotype.Component;

@Component
public class CustomerDAO {
   @Override
   public String toString(){
       return "Hello , This is CustomerDAO";
   }
}
package com.anthony1314.spring.services;

import com.anthony1314.spring.dao.CustomerDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CustomerService {

    @Autowired
    CustomerDAO customerDAO;

    @Override
    public String toString() {
        return "CustomerService [customerDAO=" + customerDAO + "]";
    }
}

  • @Qualifier 注解
    与**@Autowired** 注解一起用,注入的过程做更多的控制,@Qualifier 可以帮助你指定做更详细配置。一般在两个或者多个 bean 是相同的类型,spring 在注入的时候会出现混乱。
<bean id="hello1" class="com.anthony1314.demo.service.HelloImpl1"/>
<bean id="hello2" class="com.anthony1314.demo.service.HelloImpl2"/>
import com.anthony1314.demo.service.Hello;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:SpringBeans.xml"})
public class HelloTest {

   @Autowired
   @Qualifier("hello1")
   private Hello hello;

   @Test
   public void sayHello(){

       hello.sayHello();
   }
}
  • @Required
    为了保证所对应的属性必须被设置,@Required 注解应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
import org.springframework.beans.factory.annotation.Required;

public class Dog {

    private Person person;
    private String name;

    public Person getPerson() {
        return person;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Required
    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "person=" + person +
                ", name='" + name + '\'' +
                '}';
    }
}

    <bean id="personBean" class="com.anthony1314.spring.bean.Person">
        <property name="name" value="jack"/>
        <property name="age" value="18"/>
    </bean>

    <bean id="dogBean" class="com.anthony1314.spring.bean.Dog">
        <property name="name" value="tom"/>
        <property name="person" ref="personBean"/>
    </bean>

我发现在spring 5.0多版本的时候@Required注解idea自动就禁用了,然后用4.0多版本就不禁用,我猜spring5.0版本自动检测不用自己设置注解之类的

自动扫描

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

xml 文件中,加入了 context:component-scan 标签,beans 中也加入了标签,这样就将 Spring 的自动扫描特性引入, base-package 表示组件的存放位置,Spring 将扫描对应文件夹下的 bean(用 @Component 注释过的),将这些 bean 注册到容器中。