Bean的注解方式装配
标签:Spring

Bean的注解方式装配

1. 使用注解方式注入

  1. 需要引入 context 名称空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
  1. 添加扫描
 <context:component-scan base-package="ann"></context:component-scan>

除了@Component外,Spring提供了3个功能基本和@Component等效的注解

这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强

2. 属性的注解依赖注入

  1. 简单属性的注入 通过 @Value注解完成
@Value("shushu")
private String name;
  1. 复杂属性注入,通过@Autowired注解 完成Bean自动装配
    • @Autowired 默认按照类型进行注入,如果存在两个相同Bean类型相同,则按照名称注入
    • @Autowired注入时可以针对成员变量或者setter方法
 @Autowired
 private UserDAO userDAO;
  1. 通过@Autowired的required属性,设置一定要找到匹配的Bean
    • 使用@Qualifier指定注入Bean的名称
    • 使用@Qualifier 指定Bean名称后,注解Bean必须指定相同名称
@Autowired(required = true)
@Qualifier("uDAO")
private UserDAO userDAO;
  1. 使用@Resource注解 完成复杂对象Bean装配
    • @Resource@Autowired注解功能相似
@Autowired
@Qualifer("userDAO")
private UserDAO userDAO ;

等价于:

@Resource(name="userDAO")
private UserDAO userDAO ;

3. Bean其它属性注解设置

  1. 指定Bean的初始化方法和销毁方法(注解)
<bean init-method="" destroy-method="" />

@PostConstruct 作用等价 init-method
@PreDestroy 作用等价 destroy-method

  1. Bean的作用范围 <bean scope="" />

@Scope 注解 ,默认作用域 singleton 单例

4. 利用Config配置

Spring3.0以JavaConfig为核心,提供使用Java类定义Bean信息的方法

Car

package ann;

/**
 * Created By liuyao on 2018/5/8 16:31.
 */
public class Car {
    private String name;
    private int price;

    public String getName() {
        return this.name;
    }

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

    public int getPrice() {
        return this.price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + this.name + '\'' +
                ", price=" + this.price +
                '}';
    }
}

JavaBeanConfig

package ann;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created By liuyao on 2018/5/8 16:31.
 */
@Configuration
public class JavaBeanConfig {
    @Bean(name = "car")
    public Car initCar() {
        Car car = new Car();
        car.setName("宝马");
        car.setPrice(1000);
        return car;
    }
}

5. 多种装配Bean方式比较

基于XML配置 基于注解配置 基于Java类配置
Bean定义 <bean id="..." class="..." /> @Component 衍生类@Repository @Service @Controller @Configuration标注类,@Bean标注提供Bean方法
Bean名称 通过 id或name指定 @Component("person") @Bean("person")
Bean注入 或者 通过p命名空间 @Autowired 按类型注入 @Qualifier按名称注入 在方法内部编写注入代码逻辑
生命过程、Bean作用范围 init-method destroy-method 范围 scope属性 @PostConstruct 初始化 @PreDestroy 销毁 @Scope设置作用范围 在方法内部调用初始化方法 @Scope指定范围
适合场景 Bean来自第三方,使用其它命名空间 Bean的实现类由用户自己开发 实例化Bean的逻辑比较复杂
  • 3 min read

CONTRIBUTORS


  • 3 min read