Spring之旅第四篇-注解配置详解

1、引言

上一篇Spring的配置文章评论中有朋友指出如今不多用xml类配置SpringBean了,都是用注解的方式来进行配置,那么这篇就来说注解配置。spring

使用.xml文件来对bean进行注入的缺点很明显:文件会十分庞大,若是分多模块去配置,文件又特别的多,这些会致使可读性和可维护性变差。app

为了解决这两个问题,Spring引入了注解,经过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减小了配置文件的体积,又增长了Java Bean的可读性与内聚性。异步

2、将对象注册到容器

注解如何使用呢,分为三步ide

第一步:在 applicationContext.xml 中引入命名空间测试

第二步:在 applicationContext.xml 文件中引入注解扫描器this

<context:component-scan base-package="com.yuanqinnan.test" ></context:component-scan>

base-package:表示含有注解类的包名spa

若是扫描多个包,则上面的代码书写多行,改变 base-package 里面的内容便可!.net

若是使用Idea引入注解扫描器,就会直接引入命名空间component

第三步:在 Car 类中添加注解@Componentxml

@Component
public class Car {

    private String Color;

    public String getColor() {
        return Color;
    }

    public void setColor(String color) {
        Color = color;
    }

    @Override
    public String toString() {
        return "Car{" +
                "Color='" + Color + '\'' +
                '}';
    }
}

第四步:测试

ApplicationContext ctx=new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
          //获取bean的实例
          Car car=(Car) ctx.getBean("car");
          System.out.println(car.toString());

结果:Car{Color='null'}

3、值类型注入

@Value("yellow")
public void setColor(String color) {
    Color = color;
}

结果:Car{Color='yellow'}

4、引用类型注入

引用类型分为自动装配@Autowired和手动注入@Resource

4.1 @Autowired

顾名思义,就是自动装配,其做用是为了消除代码Java代码里面的getter/setter与bean属性中的property。固然,getter看我的需求,若是私有属性须要对外提供的话,应当予以保留。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

建立一个新类Boss

@Component
public class Boss {
    //自动装配
    @Autowired
    private Car car;

    private String name;
    @Value("袁帅")
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {

        return name;
    }

    @Override
    public String toString() {
        return "Boss{" +
                "car=" + car.getColor() +
                ", name='" + name + '\'' +
                '}';
    }
}

测试:

Boss boss=(Boss)ctx.getBean("boss");
System.out.println(boss.toString());

结果:Boss{car=yellow, name='袁帅'}

这种方式存在匹配到多个类型一致的的状况,这种状况须要Qualifier来解决

定义一个Car接口:

public interface ICar {
     String getCarName();
}

两个实现类BMWCar和BenzCar:

@Component("benzCar")
public class BenzCar implements ICar {

    @Override
    public String getCarName() {
        return "奔驰";
    }
}
@Component("bmwCar")
public class BMWCar implements ICar {
    @Override
    public String getCarName() {
        return "宝马";
    }
}

工厂类:

@Component("cf")
public class CarFactory {
    @Autowired
    private ICar iCar;

    public String toString(){
        return iCar.getCarName();
    }
}

很明显这种写法会报错,

No unique bean of type [com.spring.service.ICar] is defined: expected single matching bean but found 2: [bmwCar, benz]

很明显这种写法会报错,由于Spring并不知道应当引用哪一个实现类,这个时候使用@Qualifie

@Autowired
@Qualifier("bmwCar")
private ICar iCar;

结果:宝马

4.2 @Resource

@Resource注解与@Autowired注解做用很是类似,这个就简单说了,看例子:

@Resource(type = BenzCar.class)
private ICar iCar2;

@Resource(name = "benzCar")
private ICar iCar3;

5、经常使用注解总结

最后介绍经常使用的注解

@Configuration把一个类做为一个IoC容器,它的某个方法头上若是注册了

@Bean,就会做为这个Spring容器中的Bean。

@Scope注解 做用域 @Lazy(true) 表示延迟初始化

@Service用于标注业务层组件、

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件很差归类的时候,咱们可使用这个注解进行标注。

@Scope用于指定scope做用域的(用在类上)

@PostConstruct用于指定初始化方法(用在方法上)

@PreDestory用于指定销毁方法(用在方法上)

@DependsOn:定义Bean初始化及销毁时的顺序

@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将做为首选者,不然将抛出异常 @Autowired 默认按类型装配,若是咱们想使用按名称装配,能够结合@Qualifier注解一块儿使用。以下: @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用 @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@PostConstruct 初始化注解

@PreDestroy 摧毁注解 默认 单例 启动就加载

@Async异步方法调用

相关文章
相关标签/搜索