Annotation-Based 配置

除了之前提到的使用 XML 之外,Spring 还提供了使用 Annotation 的方式进行 Bean 配置的方法。首先我们修改 XML 配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" <!-- 新增 -->
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 新增 -->
  9. <context:annotation-config/> <!-- 打开 Annotation-Config -->
  10. <bean id="aPerson" class="com.skyline.model.Person">
  11. <property name="name" value="Chester"/>
  12. </bean>
  13. <bean id="myService" class="com.skyline.service.MyServiceImpl">
  14. <property name="greeting" value="Hello"/>
  15. </bean>
  16. </beans>

注意我们新增了一些 namespace ,同时去掉了 MyServiceImpl 当中对于 aPerson 的 ref。

下面修改 MyServiceImpl 的实现:

public class MyServiceImpl implements MyService {

    private Person person;

    private String greeting;

    public Person getPerson() {
        return person;
    }

    @Autowired // 新增
    public void setPerson(Person person) {
        this.person = person;
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

    @Override
    public String sayHello() {
        return this.greeting + " " + this.person.getName();
    }
}

运行程序,输出的结果是相同的。

通过上面的内容可以看到,本质上 @Autowired 就是把原先在 XML 中对于对象的引用配置,转移到了 Java 代码当中。

@Autowired 也可以直接用于 Constructor:

public class MyServiceImpl implements MyService {

    private Person person;

    @Autowired
    public MyServiceImpl(Person person)
    {
        this.person = person;
    }

    //...
}

甚至可以直接用在 field 上:

public class MyServiceImpl implements MyService {

    @Autowired
    private Person person;

    // ...
}