Spring 2.5 之后加入了对注解的支持,省去了繁琐的 XML 文件配置。
注解方式的出现引出了一个问题:使用注解的方式比使用 XML 配置的方式更好吗?
简洁的回答是这依赖于不同的场景。
详细的回答是,这两种方法都有优点和缺点,通常情况由开发者根据选择适合他们的方法。根据他们不同的方式,注解在声明中提供了大量的上下文,从而能够得到更简洁的配置。然而 XML 能够配置部件而不需要去修改和重新编译源码。一些开发者倾向于将配置信息于源码关联在一起但一些开发者声称这些被注解的类不再是 POJO,更麻烦的是,这些配置变得分散从而难以控制。
选择哪种方法并不重要,Spring 可以兼容两种风格,通过配置选项,Spring 允许用非侵入式方法,即能够在不修改源码的情况下使用注解。所有的配置风格都被 Spring 的 Tool Suite 支持。
注意:如果同时使用两种方式,XML 的配置会覆盖基于注解的配置
使用 XML 进行注入的过程:
首先有两个类,HelloWorld 和 HelloWorldService
HelloWorldService.java
package com.zack.springdemo;
public class HelloWorldService {
private HelloWorld hw;
public void say() {
hw.sayHello();
}
public void setHw(HelloWorld hw) {
this.hw = hw;
}
}
HelloWorld.java
package com.zack.springdemo;
public class HelloWorld {
public void sayHello() {
System.out.println("hello");
}
}
Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="helloWorldService" class="com.zack.springdemo.HelloWorldService">
<property name="hw" ref="helloWorld"></property>
</bean>
<bean id="helloWorld" class="com.zack.springdemo.HelloWorld"></bean>
</beans>
App.java
package com.zack.springdemo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorldService hws = (HelloWorldService) context.getBean("helloWorldService");
hws.say();
}
}
- 使用注解
HelloWorldService.java
package com.zack.springdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class HelloWorldService {
@Autowired
private HelloWorld hw;
public void say() {
hw.sayHello();
}
}
HelloWorld.java
package com.zack.springdemo;
import org.springframework.stereotype.Component;
@Component
public class HelloWorld {
public void sayHello() {
System.out.println("hello");
}
}
Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.zack.springdemo"/>
</beans>
在这里通过
<context:component-scan base-package="com.zack.springdemo"/>
配置让 spring 去扫描 com.zack.springdemo 包, 启用注释驱动 Bean 定义和注释驱动 Bean 的自动注入。所以这里的 xml 就可以省去 bean 的定义和属性配置。